news 2026/5/1 7:18:58

异步校验工具 awaitility

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
异步校验工具 awaitility

1.什么是awaitility ?

Awaitility 是一个用于 Java 的小型领域特定语言(DSL),主要用于简化和管理异步操作的同步问题。它的主要作用包括:

  1. 等待异步操作完成:在测试异步代码时,Awaitility 可以帮助你等待某个条件变为真,而不需要使用复杂的线程管理或轮询机制。

  2. 提高测试的可读性:通过使用流畅的 API,Awaitility 使得测试代码更易于阅读和理解。

  3. 减少测试中的线程问题:避免在测试中显式地使用Thread.sleep(),从而减少不必要的等待时间和线程问题。

  4. 灵活的超时和轮询间隔:允许你设置自定义的超时时间和轮询间隔,以便更好地控制等待条件的检查频率。

总之,Awaitility 使得在测试异步操作时更加简单和直观,特别是在需要等待某个条件满足的情况下。

2.代码工程

实验目的

一个使用 Awaitility 的简单示例,演示如何等待异步操作完成。假设我们有一个异步任务,该任务在后台线程中更新一个标志,我们希望在测试中等待这个标志变为true

pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>Java-demo</artifactId><groupId>com.et</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>Awaitility</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><!-- Awaitility dependency --><dependency><groupId>org.awaitility</groupId><artifactId>awaitility</artifactId><version>4.2.0</version></dependency><!-- JUnit dependency for testing --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version><scope>test</scope></dependency></dependencies></project>

AwaitilityExample

  1. 异步任务:startAsyncTask方法启动一个异步任务,该任务在 5秒后将flag设置为true

  2. Awaitility 使用:在main方法中,我们使用 Awaitility 的await()方法来等待flag变为true。我们设置了一个最大等待时间为 5 秒。

  3. 条件检查:until(example::isFlag)表示我们等待example.isFlag()返回true

ackage com.et;import org.awaitility.Awaitility;import java.util.concurrent.TimeUnit;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class AwaitilityExample {private volatile boolean flag = false;public void startAsyncTask() {ExecutorService executor = Executors.newSingleThreadExecutor();executor.submit(() -> {try {// mock asyncThread.sleep(5000);flag = true;} catch (InterruptedException e) {Thread.currentThread().interrupt();}});executor.shutdown();}public boolean isFlag() {return flag;}public static void main(String[] args) {AwaitilityExample example = new AwaitilityExample();example.startAsyncTask();// use Awaitility to wait flag for trueAwaitility.await().atMost(5, TimeUnit.SECONDS).until(example::isFlag);System.out.println("Flag is now true!");}}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/Java-demo(awaitility )

3.测试代码

3-1.默认等待时间

await().until(Callable conditionEvaluator) 最多等待 10s 直到 conditionEvaluator 满足条件,否则 ConditionTimeoutException。

public void testAsynchronousNormal() {AwaitilityExample example = new AwaitilityExample();example.startAsyncTask();try {// Default timeout is 10 seconds. If the condition is not met within this period, a ConditionTimeoutException is thrownAwaitility.await().until(new Callable<Boolean>() {@Overridepublic Boolean call() throws Exception {return example.isFlag();}});} catch (Exception e) {Assertions.fail("Run exception: " + e.getMessage() + ", error: " + e.getStackTrace()[0].toString());}}

3-2.最多等待

await().atMost() 设置最多等待时间,如果在这时间内条件还不满足,将抛出 ConditionTimeoutException。

@Testpublic void testAsynchronousAtMost() {AwaitilityExample example = new AwaitilityExample();example.startAsyncTask();try {// Specify a timeout of 3 seconds. If the condition is not met within this period, a ConditionTimeoutException is thrownAwaitility.await().atMost(3, SECONDS).until(new Callable<Boolean>() {@Overridepublic Boolean call() throws Exception {return example.isFlag();}});} catch (Exception e) {Assertions.fail("Run exception: " + e.getMessage() + ", error: " + e.getStackTrace()[0].toString());}}

3-3.至少等待

await().atLeast() 设置至少等待时间;多个条件时候用 and() 连接。

@Testpublic void testAsynchronousAtLeast() {AwaitilityExample example = new AwaitilityExample();example.startAsyncTask();try {// Specify at least 1 second and at most 3 seconds. If the condition is not met within this period, a ConditionTimeoutException is thrownAwaitility.await().atLeast(1, SECONDS).and().atMost(3, SECONDS).until(new Callable<Boolean>() {@Overridepublic Boolean call() throws Exception {return example.isFlag();}});} catch (Exception e) {Assertions.fail("Run exception: " + e.getMessage() + ", error: " + e.getStackTrace()[0].toString());}}

3-4.轮询

with().pollInterval(ONE_HUNDRED_MILLISECONDS).and().with().pollDelay(50, MILLISECONDS) that is conditions are checked after 50ms then 50ms+100ms。

@Testpublic void testAsynchronousPoll() {AwaitilityExample example = new AwaitilityExample();example.startAsyncTask();try {// Polling query, pollInterval specifies how often to poll, pollDelay specifies the delay between each pollAwaitility.with().pollInterval(ONE_HUNDRED_MILLISECONDS).and().with().pollDelay(50, MILLISECONDS).await("count is greater 3").until(new Callable<Boolean>() {@Overridepublic Boolean call() throws Exception {return example.isFlag();}});} catch (Exception e) {Assertions.fail("Run exception: " + e.getMessage() + ", error: " + e.getStackTrace()[0].toString());}}

3-5.Fibonacci 轮询

with().pollInterval(fibonacci(SECONDS)) 非线性轮询,按照 fibonacci 数轮询。

@Testpublic void testAsynchronousFibonacciPoll() {AwaitilityExample example = new AwaitilityExample();example.startAsyncTask();try {// Use Fibonacci numbers as the interval: 1, 1, 2, 3, 5, 8,..., default unit is millisecondsAwaitility.with().pollInterval(fibonacci(SECONDS)).await("count is greater 3").until(new Callable<Boolean>() {@Overridepublic Boolean call() throws Exception {return example.isFlag();}});} catch (Exception e) {Assertions.fail("Run exception: " + e.getMessage() + ", error: " + e.getStackTrace()[0].toString());}}

4.引用

  • https://github.com/awaitility/awaitility

  • https://www.liuhaihua.cn/archives/711844.html

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 3:40:03

星载电子系统元器件SEE阈值测试与防护策略研究

摘要&#xff1a;随着我国航天事业的快速发展&#xff0c;星载电子系统的自主可控与国产化替代已成为保障国家空间安全的重要战略方向。单粒子效应&#xff08;Single Event Effects, SEE&#xff09;作为空间辐射环境对微电子器件造成的主要威胁之一&#xff0c;其阈值测试与防…

作者头像 李华
网站建设 2026/4/15 12:25:43

深入剖析Vue双向绑定:从设计哲学到实现细节的全面解析

不仅仅是语法糖&#xff0c;更是前端工程思想的体现 &#x1f4d6; 前言&#xff1a;数据绑定演进史与Vue的设计哲学 在前端开发的演变长河中&#xff0c;数据绑定技术经历了从手动操作DOM到声明式渲染的跨越式发展。早期jQuery时代的“命令式编程”要求开发者精确控制每一个D…

作者头像 李华
网站建设 2026/3/26 0:37:06

现在的大学生没有经过任何的论文写作训练,应该如何写论文? 虎贲等考AI智能写作:https://www.aihbdk.com/

针对当前部分大学生缺乏系统论文写作训练的现状&#xff0c;本文基于学术规范要求与实操经验总结&#xff0c;构建 “认知 - 实操 - 优化” 三阶写作框架。通过明确论文核心本质、拆解标准化写作流程、整合工具应用技巧及强调学术诚信底线&#xff0c;为零基础学生提供可落地的…

作者头像 李华
网站建设 2026/4/28 8:29:04

RPA 平台架构设计核心:构建企业级自动化的底层逻辑

在数字化转型进入深水区的今天&#xff0c;RPA&#xff08;机器人流程自动化&#xff09;已从单点流程自动化工具&#xff0c;升级为支撑企业全业务链高效运转的核心平台。而决定 RPA 能否从 “小规模试点” 走向 “企业级规模化应用” 的关键&#xff0c;在于其底层架构的稳定…

作者头像 李华
网站建设 2026/5/1 7:12:53

[fastgrind] 一个轻量级C++内存监控及可视化开源库

引言在高性能计算场景下&#xff0c;常使用perf工具进行函数级别的时间分析、使用valgrind工具进行内存泄漏和内存分配异常检测。valgrind功能非常强大&#xff0c;能追踪每一段内存申请和释放的栈帧。但是valgrind使用相对复杂&#xff0c;最重要的是valgrind效率极其低下&…

作者头像 李华
网站建设 2026/5/1 7:10:14

25、打造安全的Linux系统与自建无线接入点全攻略

打造安全的Linux系统与自建无线接入点全攻略 1. 从Mac通过SSH连接到Linux系统 在运行OS X的Mac上通过SSH连接到Linux系统,其过程与在Linux下类似。操作步骤如下: - 打开“应用程序”➪“实用工具”➪“终端”,这将为你打开一个命令行窗口。 - 若要访问远程机器上与你在M…

作者头像 李华