AssertJ 是与 JUnit 5 协同使用的第三方断言库,提升可读性与表达力;需添加 Maven 依赖并静态导入 assertThat,支持链式调用、类型专用断言及清晰的失败提示。

JUnit 5 本身提供了一套清晰但偏基础的断言(如 assertEquals、assertTrue),而 AssertJ 是专为提升可读性与表达力设计的第三方断言库。它不替代 JUnit 5,而是与其协同——JUnit 负责运行测试生命周期,AssertJ 负责写出像自然语言一样流畅的校验逻辑。
引入 AssertJ 依赖
在 Maven 项目中添加 AssertJ 的测试范围依赖(推荐使用最新稳定版,截至 2026 年主流版本为 3.24.x):
<dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.24.2</version> <scope>test</scope> </dependency>
无需额外配置,引入后即可直接静态导入使用。
用 assertThat 开启链式断言
所有 AssertJ 断言都以 Assertions.assertThat(...) 或更简洁的静态导入形式 assertThat(...) 开始,后续方法可连续调用,形成语义连贯的“句子”:
立即学习“Java免费学习笔记(深入)”;
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
assertThat(user.getName()).isEqualTo("Alice").isNotBlank();assertThat(list).isNotEmpty().hasSize(5).contains("Tom", "Jerry");assertThat(result).isNotNull().isInstanceOf(Order.class).extracting("status").isEqualTo("PAID");
每个中间方法返回新的断言对象,支持无限链式;一旦某步失败,整个链终止并抛出带上下文的错误信息。
按类型选用专用断言方法
AssertJ 对不同数据结构提供了高度定制化的断言入口,避免手动遍历或类型转换:
-
字符串:支持
startsWith、containsIgnoringCase、matches(正则)、hasLineCount等 -
集合:
containsExactly(顺序敏感)、containsOnly(内容一致无序)、filteredOn(条件筛选后断言) -
Map:
containsEntry、doesNotContainKey、hasSize -
异常与可选值:
assertThatThrownBy(() -> riskyMethod()).isInstanceOf(IllegalArgumentException.class).hasMessageContaining("invalid"); -
流与 Optional:
assertThat(Stream.of(1,2,3)).allMatch(n -> n > 0);,assertThat(Optional.of("ok")).hasValue("ok");
让失败提示真正有用
AssertJ 默认生成的错误信息自带“期望 vs 实际”对比,且对复杂对象自动展开字段级差异。例如:
assertThat(users)
.extracting("name", "age")
.containsTuple("Alice", 30)
.containsTuple("Bob", 25);
若缺失 "Bob" 元组,报错会明确列出实际提取出的元组列表,并高亮缺失项,无需手动打印调试。
你还可以用 as("描述性标签") 在链中插入说明,进一步增强可追溯性:assertThat(response.body).as("API 返回体").isNotNull().asString().contains("success");

















