2010-05-06 30 views
5

我試圖單元測試一個處理javax.mail.Message實例的方法。將.eml文件加載到javax.mail.Messages中

我正在寫一個轉換器來更改以不同格式到達的電子郵件,然後轉換爲一致的內部格式(MyMessage)。此轉換通常取決於電子郵件的發件人地址或回覆地址,並且創建新的MyMessage需要電子郵件的部分,主題以及發件人和回覆地址。

我有一個保存在本地的文件.eml原料電子郵件的集合,我想打從classpath中加載.eml文件,並將其轉換爲javax.mail.Message實例單元測試。這是否可能,如果是的話,它將如何完成?

回答

0

我的問題來自於使用Mockito來模擬javax.mail.internet.MimeMessage的構造函數MimeMessage(Folder, InputStream, int)所要求的javax.mail.Folder。這將調用javax.mail.MessageMessage(Folder, int)的構造函數,然後訪問folder.store.session。這導致由構造函數MimeMessage拋出。

解決方案:

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

經過幾次測試,我終於成功地使用MimeMessage(Session, InputStream)公共構造函數成功加載了一條消息(與另一個響應中引用的基於文件夾的受保護對象相反)。

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 2015-04-23 15:00:14