1. 介绍
在对象比较时使用AssertJ忽略字段是个非常实用的功能,能让我们专注于测试核心逻辑,跳过那些动态变化或无关紧要的字段。✅ 当处理包含时间戳、随机ID或计算字段的复杂对象时,这个特性简直是救星。
本文将深入探索AssertJ流畅API中的各种字段忽略技巧。我们会从Maven依赖配置开始,通过Employee类示例逐步演示,最后覆盖不同场景下的字段忽略策略。
2. Maven依赖和示例配置
先来配置必要的依赖,在pom.xml中添加assertj-guava:
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-guava</artifactId>
<version>3.4.0</version>
</dependency>
接着创建一个Employee类作为测试对象:
public class Employee {
public Long id;
public String name;
public String department;
public String homeAddress;
public String workAddress;
public LocalDate dateOfBirth;
public Double grossSalary;
public Double netSalary;
...// 构造函数
...// getter和setter方法
}
后续章节将基于这个Employee类,演示AssertJ在不同测试场景下的字段忽略方法。
3. 使用ignoringFields()
先来看最基础的字段忽略方法。ignoringFields()
允许我们指定在比较时跳过哪些字段,特别适合处理那些实例间差异但与测试无关的字段。
用Employee类举个实际例子。创建两个员工对象,故意让某些字段不同,但在比较时忽略这些差异:
@Test
public void givenEmployeesWithDifferentAddresses_whenComparingIgnoringSpecificFields_thenEmployeesAreEqual() {
// Given
Employee employee1 = new Employee();
employee1.id = 1L;
employee1.name = "John Doe";
employee1.department = "Engineering";
employee1.homeAddress = "123 Home St";
employee1.workAddress = "456 Work Ave";
employee1.dateOfBirth = LocalDate.of(1990, 1, 1);
employee1.grossSalary = 100000.0;
employee1.netSalary = 75000.0;
Employee employee2 = new Employee();
employee2.id = 2L;
employee2.name = "John Doe";
employee2.department = "Engineering";
employee2.homeAddress = "789 Home St";
employee2.workAddress = "101 Work Ave";
employee2.dateOfBirth = LocalDate.of(1990, 1, 1);
employee2.grossSalary = 110000.0;
employee2.netSalary = 80000.0;
// When & Then
Assertions.assertThat(employee1)
.usingRecursiveComparison()
.ignoringFields("id", "homeAddress", "workAddress", "grossSalary", "netSalary")
.isEqualTo(employee2);
}
⚠️ 关键点说明:
usingRecursiveComparison()
启用递归比较ignoringFields()
接收可变参数,指定要忽略的字段名- 即使id、地址和薪资字段不同,测试仍会通过
这种写法特别适合:
- 数据库自增ID比较
- 包含时间戳的审计字段
- 计算得出的衍生字段
- 测试环境特定的配置值
记住:字段名必须是字符串形式,且与类中的字段名完全匹配(包括大小写)。踩过坑的同学都知道,字段名写错会导致忽略失效,测试意外失败。