2010-05-06 4 views
5

javax.mail.Message 인스턴스를 처리하는 메소드를 단위 테스트하려고합니다..eml 파일을 javax.mail.Messages에로드하기

다른 형식으로 도착한 전자 메일을 변경하기 위해 변환기를 작성하고 일관된 내부 형식 (MyMessage)으로 변환됩니다. 이 변환은 일반적으로 전자 메일의 보낸 사람 주소 또는 회신 주소에 따라 달라지며 MyMessage을 새로 만들 때 전자 메일, 제목 및 보낸 사람 및 회신 주소 부분이 필요합니다.

로컬로 .eml 개의 파일로 저장된 원시 전자 메일 컬렉션이 있으며 클래스 경로에서 .eml 파일을로드하고이를 javax.mail.Message 인스턴스로 변환하는 단위 테스트를하고 싶습니다. 가능한가요, 그렇다면 어떻게 될까요?

답변

0

내 문제는 javax.mail.internet.MimeMessage의 생성자 MimeMessage(Folder, InputStream, int)에 의해 요구되는 javax.mail.Folder을 모의하기 위해 Mockito를 사용함에있었습니다. 그러면 javax.mail.MessageMessage(Folder, int)의 생성자가 호출되어 folder.store.session에 액세스합니다. 이로 인해 MimeMessage의 생성자에 의해 NullPointerException이 발생했습니다.

솔루션 :

class ClasspathMimeMessage extends MimeMessage { 
    private ClasspathMimeMessage(Folder folder, InputStream is, int msgnum) throws MessagingException { 
     super(folder, is, 0); 
    } 

    public static MimeMessage create(String resourceName) { 
     Class<PopEmailMmsReceiverTest> loaderClass = PopEmailMmsReceiverTest.class; 
     InputStream is = loaderClass.getResourceAsStream(resourceName); 

     Folder inbox = new MyFolder(); 

     try { 
      return new ClasspathMimeMessage(inbox, is, 0); 
     } catch (MessagingException ex) { 
      throw new RuntimeException("Unable to load email from classpath at " + loaderClass.getResource(resourceName).toString()); 
     } 
    } 
} 

class MyFolder extends Folder { 
    MyFolder() { 
     super(createMockStore()); 
    } 
    private static Store createMockStore() { 
     return mock(Store.class); 
    } 
    public void appendMessages(Message[] msgs) throws MessagingException { 
    } 
    public void close(boolean expunge) throws MessagingException { 
    } 
    public boolean create(int type) throws MessagingException { 
     return false; 
    } 
    public boolean delete(boolean recurse) throws MessagingException { 
     return false; 
    } 
    public boolean exists() throws MessagingException { 
     return false; 
    } 
    public Message[] expunge() throws MessagingException { 
     return null; 
    } 
    public Folder getFolder(String name) throws MessagingException { 
     return null; 
    } 
    public String getFullName() { 
     return null; 
    } 
    public Message getMessage(int msgnum) throws MessagingException { 
     return null; 
    } 
    public int getMessageCount() throws MessagingException { 
     return 0; 
    } 
    public String getName() { 
     return null; 
    } 
    public Folder getParent() throws MessagingException { 
     return null; 
    } 
    public Flags getPermanentFlags() { 
     return null; 
    } 
    public char getSeparator() throws MessagingException { 
     return 0; 
    } 
    public int getType() throws MessagingException { 
     return 0; 
    } 
    public boolean hasNewMessages() throws MessagingException { 
     return false; 
    } 
    public boolean isOpen() { 
     return false; 
    } 
    public Folder[] list(String pattern) throws MessagingException { 
     return null; 
    } 
    public void open(int mode) throws MessagingException { 
    } 
    public boolean renameTo(Folder f) throws MessagingException { 
     return false; 
    } 
} 

사람이 더 나은 제안이있는 경우, 나는 그것을 듣고 기뻐 것, 그래서 이것은 나에게 매우 추한 보인다.

9

몇 가지 테스트를 마친 후에는 공용 생성자 인 (다른 응답에 인용 된 폴더 기반 보호 대상과 반대)을 사용하여 메시지를 성공적으로로드했습니다.

import java.io.FileInputStream; 
import java.io.InputStream; 

import javax.mail.internet.MimeMessage; 

public class LoadEML { 

    public static void main(String[] args) throws Exception { 
     InputStream is = new FileInputStream(args[0]); 
     MimeMessage mime = new MimeMessage(null, is); 
     System.out.println("Subject: " + mime.getSubject()); 
    } 

} 
+0

나를 위해 일했습니다. – grasshopper