2010-05-06 10 views
5

Estoy intentando probar la unidad de un método que procesa instancias javax.mail.Message.Cargando archivos .eml en javax.mail.Messages

Estoy escribiendo un convertidor para cambiar los correos electrónicos que llegan en diferentes formatos y luego se convierten a un formato interno consistente (MyMessage). Esta conversión generalmente dependerá de la dirección o dirección de respuesta del correo electrónico, y las partes del correo electrónico, el asunto y las direcciones de origen y de respuesta serán necesarias para crear el nuevo MyMessage.

que tienen una colección de mensajes de correo electrónico primas que se guardan localmente como .eml archivos, y me gustaría hacer una prueba de unidad que carga los archivos .eml de la ruta de clases y los convierte en javax.mail.Message casos. ¿Es esto posible? De ser así, ¿cómo se haría?

Respuesta

0

Mi problema vino del uso de Mockito para simular el javax.mail.Folder requerido por javax.mail.internet.MimeMessage 's constructor . Esto llama al constructor para javax.mail.MessageMessage(Folder, int) que luego accede a folder.store.session. Esto resultó en un NullPointerException lanzado por el constructor para MimeMessage.

Solución:

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

Esto se ve muy feo para mí, así que si alguien tiene una idea mejor, me encantaría escucharlo.

9

Después de algunas pruebas, finalmente cargué con éxito un mensaje usando el constructor público MimeMessage(Session, InputStream) (a diferencia del protegido basado en carpeta citado en la otra respuesta).

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

trabajado para mí también – grasshopper

Cuestiones relacionadas