Я пробую к модульному тесту метод, который обрабатывает javax.mail.Message
экземпляры.
Я пишу преобразователь для изменения электронных писем, которые прибывают в различные форматы и затем преобразовываются в последовательный внутренний формат (MyMessage
). Это преобразование будет обычно зависеть от отадресного или адресный ответом из электронной почты, и части электронной почты, предмета, и от - и адреса ответа будут требоваться для создания нового MyMessage
.
У меня есть набор необработанных электронных писем, которые сохраняются локально как .eml
файлы, и я хотел бы сделать модульный тест, который загружается .eml
файлы от пути к классу и преобразовывают их в javax.mail.Message
экземпляры. Действительно ли это возможно, и если так, как это было бы сделано?
Моя проблема возникла из-за использования 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;
}
}
Мне это кажется очень некрасивым, поэтому, если у кого-то есть предложение получше, я был бы рад его услышать.