2012-01-06 54 views
0

我有一個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版本也不包含上面的類,所以我比徹底困惑。

任何想法?

回答

0

當我來到這個早上上班,我重新添加了JavaMail 1.4.4罐子到我的類路徑(並刪除了1.3.something罐),又跑到我的測試,和它的工作。我寫這篇文章是爲了「在Exchange服務器上一夜之間改變了一些東西。」感謝您的幫助,全部。

0

麥克,

我只是看着郵件1.3.jar和郵件1.4..4.jar你是對有關此類的「MessageRemovedIOException」。有可能你正在使用期待這個類的imap.jar的最新版本。看起來像這兩個jar(和其他pop3,smtp)一起執行Javamail。

祝你好運。

-1

你應該只在你的類路徑上有一個mail.jar版本。正如你發現的,混合和匹配不同的版本不起作用。

+0

我明確指出,當我將新版本的mail.jar添加到我的類路徑中時,我排除了舊版本。 – Mike 2012-01-06 05:06:14

+0

你只有mail.jar,而不是任何其他的JavaMail jar文件?也許還有另一個版本的mail.jar被從你的環境中挑選出來?或者你的類路徑中還有另一個包含javax.mail。*類的jar文件(例如javaee.jar)?您將看到您看到的異常的唯一方法是如果您有來自不同版本的JavaMail的JavaMail類的混合。 – 2012-01-06 18:20:43