assertj 提供链式断言提升可读性与维护性,支持类型安全、语义化断言(如字符串、集合、异常、optional),并可通过 as()、自定义断言和 @displayname 进一步增强表达力。

JUnit 本身不提供链式断言,但通过集成 AssertJ,你可以用流畅、自然的语言风格写出高可读性断言,比如 assertThat(actual).isNotNull().isNotEmpty().contains("hello") —— 这比原生 JUnit 的 assertTrue(...) 或多个 assertEquals 更直观、更易维护。
引入 AssertJ 依赖
在 Maven 项目中,添加 AssertJ 核心依赖(注意版本兼容性):
- JUnit 5 用户推荐使用
assertj-core3.24.0+(支持 Java 17+,与 JUnit 5.10+ 兼容) - Gradle 示例:
testImplementation 'org.assertj:assertj-core:3.24.2' - Maven 示例:确保
<scope>test</scope>,避免泄露到生产代码
基础断言写法:从 assertThat 开始
所有 AssertJ 断言都以 assertThat(实际值) 起始,返回一个类型安全的断言对象,后续方法调用可链式组合:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
assertThat(name).isNotNull().isEqualTo("Alice")—— 同时检查非空和相等 -
assertThat(numbers).hasSize(3).containsExactly(1, 2, 3)—— 链式验证集合大小与内容 -
assertThat(result).isInstanceOf(Result.class).extracting("code").isEqualTo(200)—— 支持属性抽取与嵌套校验
处理常见类型:字符串、集合、异常、Optional
AssertJ 对不同数据类型做了语义化封装,让断言意图一目了然:
- 字符串:
assertThat(text).startsWith("v1.").contains("api").endsWith("-beta") - 集合:
assertThat(items).filteredOn("status", "ACTIVE").hasSize(2)—— 支持条件过滤后断言 - 异常:
assertThatThrownBy(() -> service.process(null)).isInstanceOf(IllegalArgumentException.class).hasMessageContaining("required") - Optional:
assertThat(optional).hasValue("ok").get().isEqualTo("ok")或isPresent().get().isNotBlank()
提升可读性的实用技巧
让断言真正“说人话”,关键在于命名清晰 + 行为聚焦:
- 用
as("描述性上下文")添加失败提示,如assertThat(user.getAge()).as("用户年龄").isBetween(18, 120) - 避免长链式调用超过 4–5 个方法;复杂逻辑可拆成多个断言,每行表达一个明确契约
- 自定义断言类(继承
AbstractAssert)封装业务规则,例如assertThat(order).isPaid().hasItems().isShippable() - 配合 JUnit 5 的
@DisplayName,让测试方法名 + AssertJ 断言共同构成完整行为说明
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










