【问题标题】:Unit Testing Apache Commons Daemon in JavaJava 中的单元测试 Apache Commons 守护进程
【发布时间】:2013-05-05 19:30:51
【问题描述】:

我四处研究,似乎找不到任何合适的资源来帮助我 JUnit 测试用 Java 编写的 apache commons 守护程序。我希望能够测试,当一个守护进程启动时,它启动时不会失败,而当它关闭时,它会正常关闭。

下面是一段守护进程在一段时间后启动和停止的示例代码:

更新

public class MyDaemon implements Daemon
{
    private Logger myLogger = LogManager.getLogger(FileLoggerImpl.class);
    private List<FileLogger> loggers;
    private List<Thread> threads;

    public void init(DaemonContext arg0) throws DaemonInitException, Exception 
    {
        myLogger.info("Starting Logger");
        loggers = new ArrayList<FileLogger>();
        threads = new ArrayList<Thread>();
        myLogger.info("Finished starting Logger");
    }

    public void start() throws Exception 
    {

        if(threads.size()>0 || loggers.size()>0)
            stop();

        for(int i = 0; i < 1; i++)
        {
            FileLogger logger = new FileLoggerImpl(Integer.toString(i));
            Thread thread = new Thread(logger);
            loggers.add(logger);
            threads.add(thread);
            thread.start();
        }

    }

    public void stop() throws Exception
    {
        myLogger.info("Cleaning up threads...");
        for(int i = 0; i < 1; i++)
        {
            FileLogger logger = loggers.get(i);
            Thread thread = threads.get(i);
            logger.isExecuting(false);
            thread.join();
        }
        myLogger.info("Stopping thread");
    }
    public void destroy() 
    {
        myLogger.info("Destroying resources...");
        loggers = null;
        threads = null;
        myLogger.info("Destroyed resources.");
    }
    public static void main(String argsv[]) 
            throws Exception
        {
            MyDaemon myDaemon = new MyDaemon();

            myDaemon.init(null);
    myDaemon.start();
            Thread.sleep(30000);
            myDaemon.stop();

        }

}

Logger 类读取文本文件并将该文本文件中的随机行写入日志文件 *

    public void run() 
    {
        String fileLocation = "/textFileLocation";
        while(isExecuting) 
        {
            try {
                logger.info(getRandomLineOpt(fileLocation));
            } catch (IOException e) {
                logger.warn("File :" + fileLocation +" not found!");
                e.printStackTrace();
            }
            pause(DELAY_SECONDS);   
        }
    }


 public String getRandomLine(String fileLoc) throws IOException
    {
        BufferedReader reader = new BufferedReader(new FileReader(fileLoc));
        //Commons IO
        ArrayList<String> lines = new ArrayList<String>();

        String line =null;
        while( (line = reader.readLine())!= null ) 
            lines.add(line);
        return lines.get(new Random().nextInt(lines.size()));
    }

非常感谢任何帮助。

【问题讨论】:

    标签: java junit daemon apache-commons-daemon


    【解决方案1】:

    由于您的示例代码缺少一些重要的事实,我们只能猜测您要做什么。

    • 我假设 MyDaemon 是 Thread 的子类。如果我是正确的,那么 你不应该使用 stop 来关闭(阅读 http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html 了解更多信息)。
    • 下一点:要进行单元测试,您需要一个“单元”进行测试,即您需要一些应该测试的方法,您可以在其中指定某些输入参数的预期输出。
    • 最后一点:由于您的代码以 stop 调用结束,因此您无法确定 Daemon 是通过 stop 调用停止还是通过在 main 方法结束后关闭整个虚拟机而停止。李>

    【讨论】:

    • 是的,MyDaemon 类实现了 Daemon 并且有一个与之关联的线程 - 我现在将更新代码以显示我的一些方法
    • 您的示例中仍然缺少的一个事实是您正在使用来自 Apache Commons 守护程序的守护程序。
    • 我会更新标题,这会让测试变得困难/不同吗?
    • 这让你很难理解你的问题是什么——我的第一个答案是基于完全不同的假设。
    • 没问题 - 感谢您的宝贵时间
    猜你喜欢
    • 2011-05-24
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多