作为一名 TDD 从业者,我想测试我编写的所有代码。
在过去的几年里,我一直在编写许多多线程代码,并且我的一部分测试非常麻烦。
当我必须断言在r un()循环期间可能发生的事情时,我最终会得到一些类似这样的断言:
assertEventually(timeout, assertion)
我知道Mockito对此有解决方案,但仅适用于验证调用。我也知道JUnit有一个 timeout 属性,它有助于避免挂起(或永久)测试。但我想要的是能够让我断言随着时间的推移可能会成为现实的东西。
所以我的问题是,有人知道提供这个的图书馆吗?
到目前为止,这是我的解决方案:
private void assertEventually(int timeoutInMilliseconds, Runnable assertion){
long begin = System.currentTimeMillis();
long now = begin;
Throwable lastException = null;
do{
try{
assertion.run();
return;
}catch(RuntimeException e){
lastException = e;
}catch(AssertionError e){
lastException = e;
}
now = System.currentTimeMillis();
}while((now - begin) < timeoutInMilliseconds);
throw new RuntimeException(lastException);
}
使用它最终是这样的:
assertEvetuallyTrue(1000, new Runnable() {
public void run() {
assertThat(Thread.activeCount()).isEqualTo(before);
}
});