Загрузка файлов .eml в javax.mail.Messages

Я пытаюсь протестировать метод, который обрабатывает javax.mail.Message экземпляров.

Я пишу конвертер для изменения электронных писем, которые приходят в разных форматах, а затем преобразуются в согласованный внутренний формат (MyMessage). Это преобразование обычно зависит от адреса отправителя или адреса ответа электронной почты, а для создания нового MyMessage потребуются части сообщения электронной почты, тема, а также адреса отправителя и ответа.

У меня есть коллекция необработанных электронных писем, которые сохраняются локально как файлы .eml, и я хотел бы сделать модульный тест, который загружает файлы .eml из пути к классам и преобразует их в экземпляры javax.mail.Message. Возможно ли это, и если да, то как это сделать?


person Armand    schedule 06.05.2010    source источник


Ответы (2)


После нескольких тестов я, наконец, успешно загрузил сообщение, используя общедоступный конструктор 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());
    }

}
person lapo    schedule 10.01.2011

Моя проблема возникла из-за использования Mockito для имитации javax.mail.Folder, требуемого конструктором javax.mail.internet.MimeMessage MimeMessage(Folder, InputStream, int). Это вызывает конструктор для javax.mail.Message Message(Folder, int), который затем обращается к folder.store.session. Это привело к тому, что конструктор выдал NullPointerException для 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;
    }   
}

Это выглядит очень уродливым для меня, поэтому, если у кого-то есть лучшее предложение, я был бы рад его услышать.

person Armand    schedule 06.05.2010