我想替换Thread.sleep为Awaitility.await(),最好进行最小的更改,因为我正在检查旧存储库中的声纳错误。我试图避免使用untilAwaitility,但它没有成功。我知道 Awaitility 是针对异步行为的,而until函数是其中的重要组成部分。我希望对 Awaitility 有更多经验的人可以建议在这个测试场景中干净地使用它,非常感谢您的意见。
//Thread.sleep(1000);
Awaitility.await().atMost(Duration.ONE_SECOND);
list = client.getLocation();
Assertions.assertFalse(list.isEmpty());
Run Code Online (Sandbox Code Playgroud)
不管你的意图如何,我鼓励你给予 Awaitility 并until()再次尝试。下面的示例在一行中测试相同的内容(尽管为了提高可读性而将其写成多行):
@Test
void test_refresh() {
Awaitility
.await()
.atMost(5, TimeUnit.SECONDS)
.until(() -> {
List<Trp> trpList = client.getAllTrps();
return !trpList.isEmpty();
});
}
Run Code Online (Sandbox Code Playgroud)
要对轮询进行更细粒度的控制,您可以查看pollInterval()和pollDelay()等方法。
虽然乍一看您所做的事情是有意义的,但是随着对库设计的更好理解,您会错过两个明显的原则。
Awaitility 库引入了函数样式用法来定义属性、条件、累加器和转换。
Awaitility
.await()
.atMost(Duration.TWO_SECONDS)
Run Code Online (Sandbox Code Playgroud)
上面的代码不会执行,因为在内部运行链的是一个Condition#await只能通过 caling 访问的调用ConditionFactory#until。
这个调用
until可以称为Terminal Operation
await、atMost和其他操作等操作timeout仅返回相同的 实例ConditionFactory,这只会以惰性方式定义行为和操作。
简而言之,设计希望您:
ConditionFactory使用的实例Awaitility#await。until使用及其变体执行和/或转换。