Awaitility:Java 异步测试这件事,它说人话
文章目录
- Awaitility:Java 异步测试这件事,它说人话
- 1、 这玩意儿是干嘛的
- 2、 为什么要用它
- 3、 怎么用
- 4、 适合哪些人用
- 5、 版本近况
Awaitility:Java 异步测试这件事,它说人话
Awaitility 在 GitHub 上已经拿到 4.0K Star 了。
这个库专门解决一个麻烦事:异步系统的测试。线程、超时、并发这些细节处理起来,测试代码的意图经常被淹掉。Awaitility 给你一个 DSL,让你用接近自然语言的方式写出对异步系统的期望。
1、 这玩意儿是干嘛的
就一件事:让异步测试代码读起来像一句话。
传统写法里,你得自己管 Thread.sleep、CountDownLatch、Future.get,还得估超时。代码一长,业务逻辑就被淹没在各种线程样板里。Awaitility 把这一层全包了,你只须声明"等到某个条件成立,最多等几秒"。
官方给的一个例子:
@TestpublicvoidupdatesCustomerStatus(){messageBroker.publishMessage(updateCustomerStatusMessage);await().atMost(Duration.ofSeconds(5)).until(customerStatusIsUpdated());...}await().atMost(...).until(...)一行就把"发消息、等异步处理完成、最多 5 秒"说清楚了。读代码的人不需要去解读锁、超时、轮询这些东西。
2、 为什么要用它
写过异步测试的人都懂这种痛。
业务逻辑本身只占一行业务代码,剩下的十几行都在处理线程池、超时退避、轮询间隔、异常捕获。测试跑起来偶尔还会因为时序问题闪烁失败,CI 一抖就红屏。
Awaitility 把这些细节压到 DSL 里。默认 100 毫秒轮询一次,超时可配置,支持 AssertJ、Hamcrest 匹配器,也能直接用 Kotlin 的 Duration。它不替你写业务断言,只替你管理"等"这件事。
3、 怎么用
Maven 项目里加依赖:
<dependency><groupId>org.awaitility</groupId><artifactId>awaitility</artifactId><version>4.3.1</version><scope>test</scope></dependency>进阶用法分两种。
第一种是untilAsserted,把断言扔进去,它会反复执行直到断言通过或超时:
await().atMost(5,SECONDS).untilAsserted(()->{assertThat(repository.count()).isEqualTo(1);});第二种是自定义轮询策略,比如用固定间隔而不是默认的 100ms:
await().pollInterval(200,MILLISECONDS).atMost(10,SECONDS).until(()->service.isReady());Kotlin 项目里也能直接写atMost(5.seconds),4.3.0 版本之后对 Kotlin time 支持更友好了。
4、 适合哪些人用
- 写消息驱动系统的 Java 开发者,比如 RabbitMQ、Kafka 那种异步消费场景
- 做集成测试、需要等容器或外部服务就绪的工程师
- 用 AssertJ 又需要异步断言的团队
5、 版本近况
4.3.1 在 2026 年 4 月发布,主要变化是默认超时和轮询设置可以通过系统属性配置了,文档和依赖管理做了一些改进。4.3.0 引入了更友好的 Kotlin 时间支持和新的untilAsserted用法。再往前 4.2.2 是对 ea JVM 版本的支持。
节奏不快,但维护很稳,每隔一段时间稳定推一版。
时间支持和新的untilAsserted用法。再往前 4.2.2 是对 ea JVM 版本的支持。
节奏不快,但维护很稳,每隔一段时间稳定推一版。