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);
}

⚠️ 关键点说明:

  1. usingRecursiveComparison()启用递归比较
  2. ignoringFields()接收可变参数,指定要忽略的字段名
  3. 即使id、地址和薪资字段不同,测试仍会通过

这种写法特别适合:

  • 数据库自增ID比较
  • 包含时间戳的审计字段
  • 计算得出的衍生字段
  • 测试环境特定的配置值

记住:字段名必须是字符串形式,且与类中的字段名完全匹配(包括大小写)。踩过坑的同学都知道,字段名写错会导致忽略失效,测试意外失败。


原始标题:Ignoring Fields During Comparison Using AssertJ | Baeldung