我有一個JBoss計劃過程(JBoss的5.0.0.GA,org.jboss.varia.scheduler.Scheduler
)這是在生產運行外JBoss的計劃過程。它的工作。它沒有單元測試。我需要改變它。無法測試的JBoss
手頭的工作是通過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://[email protected]
- 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.jar添加到我的類路徑中時,我排除了舊版本。 – Mike 2012-01-06 05:06:14
你只有mail.jar,而不是任何其他的JavaMail jar文件?也許還有另一個版本的mail.jar被從你的環境中挑選出來?或者你的類路徑中還有另一個包含javax.mail。*類的jar文件(例如javaee.jar)?您將看到您看到的異常的唯一方法是如果您有來自不同版本的JavaMail的JavaMail類的混合。 – 2012-01-06 18:20:43