gpt4 book ai didi

java - 在 Java 中断言多线程代码的最佳方法是什么

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:25:33 30 4
gpt4 key购买 nike

<分区>

作为 TDD 从业者,我想测试我编写的所有代码。

在过去的几年里,我一直在编写许多多线程代码,并且我的一部分测试一直很麻烦。

当我不得不对 run() 循环中可能发生的事情进行断言时,我最终会得到这样的断言:

assertEventually(timeout, assertion)

我知道Mockito对此有一个解决方案,但仅限于 verify 调用。我还知道 JUnit 有一个超时属性,可用于避免挂起(或持久)测试。但我想要的是让我能够断言随着时间的推移可能会成为现实的东西。

所以我的问题是,有人知道实现此目标的最佳方法吗?

到目前为止,这是我的解决方案:

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);
}
});

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com