3

大家星期五快乐,我想用 Awaitility.await() 替换 Thread.sleep,最好只做最少的更改,因为我正在处理旧存储库中的 Sonar 错误。我试图避免使用untilAwaitility,但它没有成功。我了解 Awaitility 是针对异步行为的,而until功能是其中的重要组成部分。我希望对 Awaitility 有更多经验的人可以建议在这个测试场景中干净地使用它,非常感谢您的意见。

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

2 回答 2

5

尽管你的意图,我鼓励你给等待和until()再试一次。下面的示例在单个单行中测试相同的内容(尽管为了提高可读性而将其写成多行):

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

要对轮询进行更细粒度的控制,您可以查看pollInterval()pollDelay()等方法。

于 2021-08-06T21:57:01.763 回答
2

尽管您所做的第一眼看起来很有意义,但是随着对库设计的更好理解,您可能错过了两个明显的原则。

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

1.终端操作。


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

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

这个调用until 可以称为Terminal Operation

2. 中间操作。


await,atMosttimeout其他操作这样的操作只返回相同的 实例ConditionFactory,它只会以惰性方式定义行为和动作。

因此,简而言之,设计希望您:

  1. 创建ConditionFactoryusing的实例Awaitility#await
  2. 使用中间方法定义您的等待行为。
  3. until使用及其变体执行和/或转换。
于 2021-08-06T22:59:30.247 回答