[英]Can't test JBoss-scheduled process outside JBoss
我有一个正在生产中运行的JBoss Scheduled流程(JBoss 5.0.0.GA, org.jboss.varia.scheduler.Scheduler
)。 它做它的工作。 它没有单元测试。 我需要更改它。
当前的工作是通过IMAP连接到公司的Exchange服务器,扫描特定文件夹中的新邮件,并对发现的邮件进行处理。
因此,我的首要目标是为此编写一些简单的单元测试,而我要做的第一件事就是在文件夹中获取消息数量。 生产代码中已经包含了执行此操作的代码,包括打印出文件夹中的邮件计数。 在为本文创建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.something版本),此版本的mail.jar不包含上述类。 但是,我还下载了具有上述类的JavaMail版本1.4.4,并在类路径中包含1.4.4(并且还排除了1.3.something)。 这就产生了一个不同的错误,我现在无法访问(我不再在发布此帖子的工作计算机上……)但是,似乎这里有一些更基本的东西,或者至少更具体在这一点上,我对JBoss表示肯定。 JBoss的类路径上的mail.jar
版本也不包含上面的类,因此我感到非常困惑。
有任何想法吗?
麦克风,
我只是看了mail-1.3.jar和mail-1.4..4.jar,您对此类“ MessageRemovedIOException”的看法是正确的。 您可能正在使用期望使用该类的最新版本的imap.jar。 看起来这两个jar(以及其他pop3,smtp)与Javamail的实现一起使用。
祝好运。
今天早上上班时,我将JavaMail 1.4.4罐子加回到了我的类路径中(并删除了1.3.something罐子),再次运行了测试,它就可以了。 我将其写为“一夜之间Exchange服务器发生了某些变化”。 谢谢您的帮助。
您的类路径上应该只有一个版本的mail.jar。 如您所知,混合和匹配不同的版本是行不通的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.