Загрузка файлов .eml в javax.mail.Messages - PullRequest
5 голосов
/ 06 мая 2010

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

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

.

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

Ответы [ 2 ]

10 голосов
/ 10 января 2011

После нескольких тестов я наконец-то успешно загрузил сообщение, используя открытый конструктор 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 голосов
/ 06 мая 2010

Моя проблема возникла из-за использования 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;
    }   
}

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

...