У меня есть процесс JBoss Scheduled (JBoss 5.0.0.GA, org.jboss.varia.scheduler.Scheduler
), который запущен в производство.Это делает свою работу.У него нет юнит-тестов.И мне нужно изменить его.
Работа заключается в том, чтобы подключиться к серверу Exchange компании через IMAP, сканировать определенную папку на наличие новых сообщений и что-то делать с найденными сообщениями.
Итак, моя первая цель - написать несколько простых модульных тестов, и первое, что я хочу сделать, - это просто получить количество сообщений в папке.Код для этого, включая печать количества сообщений в папке, уже находится в рабочем коде.Создавая SSCCE для этого поста, я, по сути, просто удалил часть «и сделайте что-нибудь с сообщениями, которые он находит», вместе с небольшим количеством запутывания и упрощения.
Итак, теперь код:
package com.mycompany.utils;
import org.apache.log4j.Logger;
import org.jboss.varia.scheduler.Schedulable;
import java.util.Date;
import java.util.Properties;
import javax.mail.Folder;
import javax.mail.Session;
import javax.mail.Store;
public class BouncedEmailSimple implements Schedulable {
private static final Logger logger = Logger.getLogger("com.mycompany.utils");
@Override
public void perform(Date pTimeOfCall, long pRemainingRepetitions) {
String popHost = "192.168.1.55";
String smtpHost = "192.168.1.55";
String popUser = "username";
String popPasswd = "password";
Session session = null;
Folder folder = null;
Store store = null;
try {
Properties sysProperties = System.getProperties();
sysProperties.put("mail.smtp.host", smtpHost);
session = Session.getInstance(sysProperties, null);
session.setDebug(false);
logger.info("Started Bounce Email Simple process.");
logger.info("user:" + popUser);
logger.info("smtp:" + smtpHost);
logger.info("pop:" + popHost);
store = session.getStore("imap");
store.connect(popHost, popUser, popPasswd);
logger.info("store:" + store);
folder = store.getDefaultFolder();
logger.info("1");
if (folder == null) {
logger.error("No Default Mail Folder");
throw new Exception("No Default Mail Folder");
}
logger.info("2");
folder = folder.getFolder("Bounces");
logger.info("3");
if (folder == null) {
logger.error("Bounce Mail folder not available");
throw new Exception("Bounce Mail folder not available");
}
logger.info("4");
folder.open(Folder.READ_WRITE);
logger.info("5");
int totalMessages = folder.getMessageCount();
logger.info("6");
if (totalMessages == 0) {
folder.close(false);
store.close();
return;
}
logger.info("7");
logger.info("Messages to process = [" + totalMessages + "]");
logger.info("8");
System.out.println("Ended Bounce Email Simple processes.");
} catch (Exception ex) {
logger.error("BouncedEmailSimple Server Failure");
logger.error("Error = [" + ex.getMessage() + "]");
try {
if (folder.isOpen()) {
folder.close(false);
}
} catch (Exception ex3) {
ex3.printStackTrace();
}
ex.printStackTrace();
} finally {
try {
if (store.isConnected()) {
store.close();
}
} catch (Exception ex4) {
ex4.printStackTrace();
}
}
}
}
И пример модульного теста:
package com.mycompany.utils;
import org.junit.Test;
import java.util.Date;
import static org.junit.Assert.fail;
public class BouncedEmailSimpleTest {
@Test
public void actualTest() {
try {
BouncedEmailSimple bes = new BouncedEmailSimple();
bes.perform(new Date(), 0);
} catch (Exception e) {
e.printStackTrace();
fail();
}
}
}
Когда я запускаю его, вывод:
$ cat junit/TEST-com.mycompany.utils.BouncedEmailSimpleTest.txt
Testsuite: com.mycompany.utils.BouncedEmailSimpleTest
Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0.603 sec
------------- Standard Output ---------------
- Started Bounce Email Simple process.
- user:devsupport
- smtp:192.168.1.55
- pop:192.168.1.55
- store:imap://username@192.168.1.55
- 1
- 2
- 3
- 4
------------- ---------------- ---------------
Testcase: actualTest took 0.43 sec
Caused an ERROR
com/sun/mail/util/MessageRemovedIOException
java.lang.NoClassDefFoundError: com/sun/mail/util/MessageRemovedIOException
at com.sun.mail.imap.IMAPFolder.open(IMAPFolder.java:809)
at com.mycompany.utils.BouncedEmailSimple.perform(Unknown Source)
at com.mycompany.utils.BouncedEmailSimpleTest.actualTest(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.sun.mail.util.MessageRemovedIOException
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
У меня mail.jar
(версия 1.3что-то) в моем classpath для моего модульного теста, и эта версия mail.jar не содержит вышеуказанного класса.Тем не менее, я также скачал JavaMail версии 1.4.4, которая имеет вышеупомянутый класс и включила 1.4.4 (а также исключил 1.3.something) в пути к классам.Это приводит к другой ошибке, к которой я не могу получить доступ прямо сейчас (я больше не на своем рабочем компьютере, где была запущена эта публикация ...) Однако, кажется, что здесь есть что-то более фундаментальное или, по крайней мере, более конкретноек JBoss, чем я положительно на данный момент.Версия mail.jar
на пути к классам JBoss также не содержит приведенный выше класс, поэтому я более чем запутался.
Есть идеи?