Pregunta

Estoy tratando de probar la unidad un método que procesa casos javax.mail.Message.

Yo escribo un convertidor a los correos electrónicos de cambio que llegan en diferentes formatos y luego se convierten en un formato interno consistente (MyMessage). Esta conversión suele depender de la dirección del o responder dirección del correo electrónico, y las partes del correo electrónico, el tema, y ??el de- y Responder direcciones serán requeridos para la creación de la nueva MyMessage.

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

¿Fue útil?

Solución 2

Mi problema venía de usar Mockito burlarse de la javax.mail.Folder requerida por el constructor de javax.mail.internet.MimeMessage MimeMessage(Folder, InputStream, int). Esto llama al constructor de javax.mail.Message Message(Folder, int) que luego accede folder.store.session. Esto resultó en una NullPointerException ser arrojado 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.

Otros consejos

Después de algunas pruebas, finalmente cargado correctamente un mensaje usando el constructor público MimeMessage(Session, InputStream) (en contraposición a la protegida basada en carpetas citada 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());
    }

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top