assertj 断言通过提供链式 api 和 fluent assertions 来简化 java 单元测试中的验证逻辑,核心做法是引入 assertj-core 依赖后使用 assertions.assertthat() 方法获取断言对象,并调用如 .isequalto()、.contains() 等方法进行校验。这样做的好处是断言失败时会自动生成包含预期值与实际值的详细错误信息,且代码可读性远高于 junit 原生断言。若处理集合或字符串等复杂类型,可结合 extracting() 或 matches() 等高级方法进行精准匹配。

如何对基本数据类型和集合进行基础断言
对于基本数据类型、字符串及集合,AssertJ 提供了直观的断言方法,例如使用 .isNotNull() 检查非空,用 .hasSize() 验证集合长度。在处理 List 时,可直接调用 .contains() 验证元素存在性,或使用 .startsWith() 检查顺序。这些方法均返回当前断言对象,支持链式调用,使得测试代码简洁明了。当断言失败时,AssertJ 会抛出 AssertionError 并打印对比结果,帮助快速定位问题。

import org.assertj.core.api.Assertions;
import java.util.Arrays;
import java.util.List;
public class AssertJBasicTest {
public static void main(String[] args) {
// 示例输入:一个整数和一个列表
int expectedAge = 30;
List<String> fruits = Arrays.asList("apple", "banana", "cherry");
// 断言整数相等
Assertions.assertThat(expectedAge).isEqualTo(30);
// 断言列表大小
Assertions.assertThat(fruits).hasSize(3);
// 断言列表包含特定元素
Assertions.assertThat(fruits).contains("banana");
// 断言列表以特定元素开头
Assertions.assertThat(fruits).startsWith("apple");
System.out.println("所有基础断言通过");
}
}
如何对自定义对象和嵌套属性进行断言
针对自定义对象,AssertJ 允许通过字段名或 getter 方法提取属性进行断言,常用 extracting() 方法将对象转换为具体类型的断言上下文。例如,对于包含嵌套对象的 User 类,可使用 extracting("name") 直接获取 name 字段并断言其值。若需比较多个属性,可传入多个字段名数组,AssertJ 会将它们打包为元组进行比较。这种方式避免了手动编写繁琐的 assertEquals(user.getName(), "John") 代码,提升了测试的可维护性。
立即学习“Java免费学习笔记(深入)”;

import org.assertj.core.api.Assertions;
// 假设的自定义类
class User {
String name;
Address address;
public User(String name, Address address) { this.name = name; this.address = address; }
public String getName() { return name; }
public Address getAddress() { return address; }
}
class Address {
String city;
public Address(String city) { this.city = city; }
public String getCity() { return city; }
}
public class AssertJObjectTest {
public static void main(String[] args) {
// 示例输入:一个包含嵌套地址的用户对象
Address addr = new Address("Beijing");
User user = new User("Alice", addr);
// 断言用户名称
Assertions.assertThat(user).extracting("name").isEqualTo("Alice");
// 断言嵌套属性:提取 address 再提取 city
Assertions.assertThat(user)
.extracting("address.city")
.isEqualTo("Beijing");
// 断言多个属性
Assertions.assertThat(user)
.extracting("name", "address.city")
.containsExactly("Alice", "Beijing");
System.out.println("所有对象断言通过");
}
}
当断言失败时 AssertJ 如何展示差异信息
当断言条件不满足时,AssertJ 会抛出 AssertionError,并在消息中清晰展示预期值(expected)与实际值(actual)的差异。对于集合,它会列出缺失或多余的元素;对于字符串,它会高亮显示不同字符的位置。这种详细的错误报告无需开发者额外配置,是 AssertJ 的核心优势之一。在调试测试用例时,直接查看控制台输出的 AssertionError 即可快速理解断言为何失败,从而修正测试数据或业务逻辑。


















