首页 > 解决方案 > Awaitility 的 `during` 和 `atMost` 周围的不可预测的行为

问题描述

在我测试 Kafka 时,我最终遇到了一些关于 Awaitility 的问题。目标是测试 Kafka 主题在指定时间内不包含新记录。这是我测试的简化版,但它显示了问题。我希望 ConditionTimeoutException 在这种情况下不会抛出。但确实如此。

public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        await("wait").during(5_000, TimeUnit.MILLISECONDS).atMost(5_000, TimeUnit.MILLISECONDS)
                .pollInterval(100, TimeUnit.MILLISECONDS)
                .until(() -> list, List::isEmpty);
}

我将atMost超时增加到 5000 + pollInterval -> 5100 但仍然以异常结束。在我的本地机器上抛出异常被停止关闭atMost超时值 5170-5180。我应该记住一些事情吗?还是测试不正确?

标签: testingawaitility

解决方案


在您的情况下,您要确保列表在 5 秒后仍然为空。只需删除“atMost”部分。此代码应该可以工作:

  public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    await("wait").during(5_000, TimeUnit.MILLISECONDS)
            .pollInterval(100, TimeUnit.MILLISECONDS)
            .until(() -> list, List::isEmpty);
  }

如果您想将“during”与“atMost”一起使用,请确保 atMost 时间更大:

  public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    await("wait").during(5_000, TimeUnit.MILLISECONDS).atMost(5_500, TimeUnit.MILLISECONDS)
            .pollInterval(100, TimeUnit.MILLISECONDS)
            .until(() -> list, List::isEmpty);
  }

推荐阅读