AssertJ 通过 assertThat(actual) 统一入口和链式语义化断言,提升可读性与可维护性;支持类型精准校验、软断言、异常断言及自定义断言。

Java 单元测试中用 AssertJ 替代原生 JUnit 断言,核心是把“验证什么”变成“自然地说出你想确认的事”。它不靠省代码行数取胜,而是让每行断言自带上下文、失败时一眼看懂问题在哪。
引入依赖并静态导入
先在项目中加 AssertJ 依赖(Maven 示例):
然后在测试类顶部静态导入:
import static org.assertj.core.api.Assertions.*;
注意别和 JUnit 的 assertThat(来自 Hamcrest)混用——二者方法签名相似但行为不同,容易误调导致编译通过但逻辑跑偏。
写法对比:从“位置敏感”到“意图优先”
传统 JUnit 断言容易混淆期望值与实际值:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
assertEquals(expected, actual); // 顺序错就白测了
AssertJ 统一以 assertThat(actual) 开头,后续所有操作都围绕这个“被验证对象”展开:
assertThat(actual).isEqualTo(expected);assertThat(list).contains("a", "b").hasSize(2);assertThat(result).isNotNull().isInstanceOf(String.class);
每个方法名就是它的语义,不需要记忆参数顺序,也不用猜哪个是“应该的”、哪个是“得到的”。
针对常见类型做精准断言
AssertJ 对不同数据类型做了深度适配,避免手动写 if/else 或循环校验:
-
字符串:用
isNotBlank()、startsWith("Error")、matches("Error.*timeout") -
集合:用
containsExactly("Alice", "Bob")(严格顺序)、containsOnly("Alice", "Bob")(不关心顺序) -
对象字段提取:
extracting("name", "age")或extracting(User::getName)后再链式断言 -
流(Stream):直接
assertThat(stream).allMatch(n -> n > 0),无需先 collect 成 list
利用高级能力提升可维护性
复杂场景下,AssertJ 提供的不只是语法糖:
-
软断言:一次收集多个断言结果,全部执行完才报错,适合批量校验:
SoftAssertions softly = new SoftAssertions(); -
异常断言:
assertThatThrownBy(() -> riskyMethod()).isInstanceOf(IllegalArgumentException.class).hasMessageContaining("invalid"); -
自定义断言:为业务对象封装专用断言类,比如
assertThat(order).isPaid().hasNoPendingItems();
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










