繁体   English   中英

无法在JBoss外部测试JBoss计划的进程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM