Java - Thread.sleep VS Awaitility.await()

use*_*629 8 java awaitility

我想替换Thread.sleepAwaitility.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)

mat*_*sev 9

不管你的意图如何,我鼓励你给予 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()等方法。


Sal*_*air 6

虽然乍一看您所做的事情是有意义的,但是随着对库设计的更好理解,您会错过两个明显的原则。

Awaitility 库引入了函数样式用法来定义属性、条件、累加器和转换。

1. 终端操作。


  Awaitility
       .await()
       .atMost(Duration.TWO_SECONDS)
Run Code Online (Sandbox Code Playgroud)

上面的代码不会执行,因为在内部运行链的是一个Condition#await只能通过 caling 访问的调用ConditionFactory#until

这个调用until 可以称为Terminal Operation

2. 中间操作。


awaitatMost和其他操作等操作timeout仅返回相同的 实例ConditionFactory,这只会以惰性方式定义行为和操作。

简而言之,设计希望您:

  1. 创建一个ConditionFactory使用的实例Awaitility#await
  2. 使用中间方法定义您的等待行为。
  3. until使用及其变体执行和/或转换。