Загрузка .eml файлы в javax.mail. Сообщения

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

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

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

6
задан Armand 6 May 2010 в 15:30
поделиться

1 ответ

Моя проблема возникла из-за использования Mockito для имитации javax.mail.Folder , необходимого для javax.mail.internet.MimeMessage конструктора MimeMessage (Folder, InputStream, int) . Это вызывает конструктор для javax.mail.Message Message (Folder, int) , который затем обращается к folder.store.session . В результате конструктор MimeMessage выбросил NullPointerException .

Решение:

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

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

0
ответ дан 9 December 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: