testing - 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。我应该记住一些事情吗?还是测试不正确?
解决方案
在您的情况下,您要确保列表在 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);
}
推荐阅读
- c - 为什么使用 exec 调用时没有将 argv[0] 设置为程序名称?
- scripting - 如何使用 KEY_pre_write 方法从 Zapier(脚本)中的操作字段更改“键”名称?
- java - 方法参考没有懒惰地评估?
- emacs - emacs 在特定窗口中更改文件
- java - JRE 8u192 - javax.security.auth.login.FailedLoginException:无法绑定到 LDAP 服务器
- javascript - react 访问 API 响应
- node.js - Fabric节点sdk使用服务发现功能
- amazon-athena - 在 Athena/Presto 中将数组拆分为列
- matlab - 在 csv 标头中保留空格(Matlab)
- c# - 按日期对数据表行排序