如何对使用jUnit简单启动线程的方法进行单元测试?

时间:2012-06-18 09:51:20

标签: java multithreading unit-testing testing junit

在标题中,我想测试这样的方法:

public void startThread()
{
    new Thread()
    {
        public void run()
        {
            myLongProcess();
        }
    }.start();
}

编辑: 根据评论判断,我猜测一个线程是否启动并不常见。所以我要调整问题......如果我的要求是100%的代码覆盖率,我是否需要测试该线程是否启动?如果是这样,我真的需要一个外部框架吗?

2 个答案:

答案 0 :(得分:7)

这可以通过Mockito优雅地完成。假设该类名为ThreadLauncher,您可以确保startThread()方法导致myLongProcess()调用:

public void testStart() throws Exception {
    // creates a decorator spying on the method calls of the real instance
    ThreadLauncher launcher = Mockito.spy(new ThreadLauncher());

    launcher.startThread();
    Thread.sleep(500);

    // verifies the myLongProcess() method was called
    Mockito.verify(launcher).myLongProcess();
}

答案 1 :(得分:1)

如果您需要100%的覆盖率,则需要致电startThread,这将启动一个主题。我建议进行某种验证线程被盯着(通过验证myLongProcess中的某些内容正在发生,然后清理线程。然后你可能会通过调用来完成myLongProcess的剩余测试该方法直接来自您的单元测试。