【问题标题】:Java - Thread.sleep VS Awaitility.await()Java - Thread.sleep VS Awaitility.await()
【发布时间】:2021-08-06 21:44:12
【问题描述】:

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

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

【问题讨论】:

  • 如果不想使用until,不妨使用sleep
  • Boris the Spider 打败了我: 问:如果你有一堆使用 Thread.sleep() 的代码......如果 Thread.Sleep 有效......那你为什么想换成Awaitility.await()???你的动机是什么/有什么好处? PS:您可能还想考虑这些替代方案:baeldung.com/java-delay-code-execution
  • @paulsm4 我想替换它以满足声纳规则。
  • 谢谢你说星期五快乐!!!

标签: java awaitility


【解决方案1】:

尽管您有意,我还是鼓励您再试一次 Awaitility 和 until()。下面的示例在单行中测试相同的内容(尽管为了提高可读性,它被写成多行):

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

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

【讨论】:

  • 根据 OP 的更新,这似乎是 XYProblem。问题并不是真正的“Thread.sleep()”,解决方案也不一定是“Awaitility.await()”。 REAL 问题是 Sonar 正在抱怨“Thread.sleep()”。
  • 我喜欢您的解决方案,它还解决了 for 循环问题,非常感谢您的输入,非常感谢。
  • @paulsm4 感谢您的评论。我猜这是导致问题的声纳警告:rules.sonarsource.com/java/RSPEC-2925,它提到了Awaitility.await().atMost().until() 作为可能的解决方案。
【解决方案2】:

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

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

1。终端操作。


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

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

until 的调用可以称为Terminal Operation

2。中间操作。


awaitatMosttimeout 等操作只返回相同的ConditionFactory 实例,它只会以惰性方式定义行为和动作。 p>

所以简而言之,设计希望您:

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

【讨论】:

    猜你喜欢
    • 2012-07-08
    • 2020-05-14
    • 2023-03-12
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2015-01-12
    相关资源
    最近更新 更多