我有一个实现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);
}
}
但这不起作用。有什么方法可以测试这个类来覆盖所有代码吗?
答案 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>);
}