如何对实现Runnable的类进行单元测试

时间:2015-08-11 05:21:02

标签: java multithreading unit-testing junit

我有一个实现Runnable接口的类ExampleThread。

public class ExampleThread implements Runnable {

    private int myVar;

    public ExampleThread(int var) {
        this.myVar = var;
    }

    @Override
    public void run() {
        if (this.myVar < 0) {
            throw new IllegalArgumentException("Number less than Zero");
        } else {
            System.out.println("Number is " + this.myVar);
        }
    }
}

如何为此类编写JUnit测试。我试过以下

public class ExampleThreadTest {

    @Test(expected = IllegalArgumentException.class)
    public void shouldThrowIllegalArgumentExceptionForInvalidNumber() {
        ExampleThread exThread = new ExampleThread(-1);

        ExecutorService service = Executors.newSingleThreadExecutor();
        service.execute(exThread);
    }
}

但这不起作用。有什么方法可以测试这个类来覆盖所有代码吗?

2 个答案:

答案 0 :(得分:11)

我想你只想测试run()方法是否正确。目前您还要测试ServiceExecutor

如果您只想编写单元测试,则应在测试中调用run方法。

public class ExampleThreadTest {

    @Test(expected = IllegalArgumentException.class)
    public void shouldThrowIllegalArgumentExceptionForInvalidNumber() {
        ExampleThread exThread = new ExampleThread(-1);
        exThread.run();
    }
}

答案 1 :(得分:2)

来自Java Doc

  

void execute(Runnable command)

     

将来某个时间执行给定的命令。该命令可以在Executor实现的判断下在新线程,池化线程或调用线程中执行。

这意味着,在 Testcase 完成之前,命令不会完成执行。

因此,在测试用例结束之前没有抛出IllegalArgumentException。因此它会失败。

在完成测试用例之前,您需要等待它完成。

@Test(expected = IllegalArgumentException.class)
public void shouldThrowIllegalArgumentExceptionForInvalidNumber() {
    ExampleThread exThread = new ExampleThread(-1);

    ExecutorService service = Executors.newSingleThreadExecutor();
    service.execute(exThread);

    // Add something like this.
    service.shutdown();
    service.awaitTermination(<sometimeout>);
}