Java - Thread.sleep VS Awaitility.await()

Java - Thread.sleep VS Awaitility.await()

大家周五快乐, 我想将 Thread.sleep 替换为 Awaitility.await(),理想情况下更改最少,因为我要检查旧存储库中的 Sonar 错误。我试图避免使用 until 的 Awaitility,但没有成功。我知道 Awaitility 是针对异步行为的,而 until 函数是其中的重要组成部分。我希望对 Awaitility 有更多经验的人可以建议在此测试场景中干净地使用它,非常感谢您的意见。

    //Thread.sleep(1000);
    Awaitility.await().atMost(Duration.ONE_SECOND);
    list = client.getLocation();
    Assertions.assertFalse(list.isEmpty());

不管你的意图如何,我鼓励你再试一次 Awaitility 和 until()。下面的例子在一个单行代码中测试了同样的事情(尽管为了提高可读性,它被写成几行):

@Test
void test_refresh() {
    Awaitility
       .await()
       .atMost(5, TimeUnit.SECONDS)
       .until(() -> { 
           List<Trp> trpList = client.getAllTrps();
           return !trpList.isEmpty();
       });
}

为了更精细地控制轮询,您可以查看 pollInterval() and pollDelay().

等方法

虽然乍一看您所做的是有道理的,但是随着对库设计的更好理解,您会忽略两个明显的原则。

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

1。终端操作。


  Awaitility
       .await()
       .atMost(Duration.TWO_SECONDS)

上面的代码不会执行,因为在内部运行链的是对 Condition#await 的调用,它只能通过调用 ConditionFactory#until.

来访问

This call to until can be called a Terminal Operation

2。中间操作。


操作如awaitatMosttimeout和其他操作仅return ConditionFactory的相同实例,它只会定义行为和动作以懒惰的方式。

简而言之,设计希望您:

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