2010-05-06 18 views
5

Birim testini, javax.mail.Message örneklerini işleyen bir yöntem denemeye çalışıyorum.Yükleme .eml dosyaları içine javax.mail.Messages

Farklı biçimlerde gelen e-postaları değiştirmek için dönüştürücü yazıyorum ve daha sonra tutarlı bir iç biçime dönüştürülüyor (MyMessage). Bu dönüşüm genellikle e-postanın adres veya cevap adresine bağlı olacaktır ve e-postanın parçaları, konu ve gelen ve cevap adresleri yeni MyMessage'u oluşturmak için gerekli olacaktır.

Ben .eml dosyaları olarak yerel olarak kaydedilmiş ham e-postaların bir koleksiyon var ve sınıfyolundan .eml dosyaları yükler ve javax.mail.Message örneklerine dönüştürür bir birim testi yapmak istiyorum. Bu mümkün mü ve eğer öyleyse, nasıl yapılır?

cevap

0

Sorunum, javax.mail.internet.MimeMessage kurucusu MimeMessage(Folder, InputStream, int) tarafından istenen numaralı ürüne bağlanmak için Mockito kullanıldı. Bu, folder.store.session erişen javax.mail.MessageMessage(Folder, int) için yapıcıyı çağırır. Bu, MimeMessage için yapıcı tarafından atılan bir NullPointerException ile sonuçlandı.

Çözüm:

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; 
    } 
} 

kimse daha iyi bir fikrin varsa, duymak mutluluk duyarım böylece bu, bana çok çirkin görünüyor.

9

Birkaç testten sonra, MimeMessage(Session, InputStream) kamu kurucusunu (diğer yanıtta belirtilen Klasör tabanlı korumalı olanın aksine) kullanarak bir iletiyi başarıyla yükledim.

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

benim için de çalıştı – grasshopper

İlgili konular