使用 AssertJ 在比較過程中忽略字段
一、簡介
在與 AssertJ 進行比較時忽略欄位是一項強大的功能,它只專注於物件的相關部分,有助於簡化測試。當處理具有動態或不相關值的欄位的物件時,它很有用。
在本文中,我們將了解 AssertJ Fluent API 中的各種方法。我們將首先設定正確的依賴關係並提供employee
類別的簡單範例。然後,我們將探索使用 AssertJ 提供的方法忽略物件比較中所需欄位的各種用例。
2. Maven 依賴關係和範例設置
讓我們從設定使我們能夠使用此功能所需的依賴項開始。我們將在pom.xml:
中加入ssertj-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;
...// constructor
...//getters and setters
}
在接下來的部分中,我們將重點放在 AssertJ Fluent API 提供的方法,以在各種情況下忽略Employee
類別測試中的所需欄位。
3.使用ignoringFields()
首先,讓我們看看在比較實際物件和預期物件時如何指定要忽略的一個或多個欄位。在這裡,我們可以使用 API ignoringFields()
方法。它讓我們指定在比較過程中應忽略哪些欄位。當我們想要排除實例之間可能不同但與測試無關的欄位時,這特別有用。
讓我們使用之前建立的Employee
類別的範例。我們將建立Employee
類別的兩個實例,然後使用 AssertJ 比較它們,同時忽略一些欄位:
@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);
}
在這裡,在比較兩個Employee
物件時,我們希望忽略id,
homeAddress
、 workAddress
、 grossSalary,
和netSalary
欄位.
這意味著即使所有這些被忽略的欄位對於employee1
和employee2
來說都是不同的,相等性仍然成立。
4. 使用**ignoringFieldsMatchingRegexes()
**
AssertJ也提供了ignoringFieldsMatchingRegexes()
方法,讓我們可以根據正規表示式忽略欄位。當我們有多個名稱相似且可能想要排除的欄位時,這非常有用。
假設我們有一個Employee
類,其中homeAddress
、 workAddress,
等欄位在比較中應被忽略。同樣,我們要忽略所有以「 Salary”
結尾的欄位:
@Test
public void givenEmployeesWithDifferentSalaries_whenComparingIgnoringFieldsMatchingRegex_thenEmployeesAreEqual() {
Employee employee1 = new Employee();
employee1.id = 1L;
employee1.name = "Jane Smith";
employee1.department = "Marketing";
employee1.homeAddress = "123 Home St";
employee1.workAddress = "456 Work Ave";
employee1.dateOfBirth = LocalDate.of(1990, 1, 1);
employee1.grossSalary = 95000.0;
employee1.netSalary = 70000.0;
Employee employee2 = new Employee();
employee2.id = 2L;
employee2.name = "Jane Smith";
employee2.department = "Marketing";
employee2.homeAddress = "789 Home St";
employee2.workAddress = "101 Work Ave";
employee2.dateOfBirth = LocalDate.of(1990, 1, 1);
employee2.grossSalary = 98000.0;
employee2.netSalary = 72000.0;
Assertions.assertThat(employee1)
.usingRecursiveComparison()
.ignoringFields("id")
.ignoringFieldsMatchingRegexes(".*Address", ".*Salary")
.isEqualTo(employee2);
}
在這裡,除了id
欄位之外,所有以Address
和Salary
結尾的欄位都會使用ignoringFieldMatchingRegex()
被忽略。
5. 使用ignoringExpectedNullFields()
最後,我們將研究 AssertJ API 中的ignoreExpectedNullFields()
方法。此方法在比較期間忽略預期物件中為空的欄位。當只有某些欄位在預期物件中很重要,而其他欄位未設定或不相關時,這特別有用。
假設我們要比較兩個Employee
對象,但在預期對像中,某些欄位為null
,應被忽略:
@Test
public void givenEmployeesWithNullExpectedFields_whenComparingIgnoringExpectedNullFields_thenEmployeesAreEqual() {
Employee expectedEmployee = new Employee();
expectedEmployee.id = null;
expectedEmployee.name = "Alice Johnson";
expectedEmployee.department = null;
expectedEmployee.homeAddress = null;
expectedEmployee.workAddress = null;
expectedEmployee.dateOfBirth = LocalDate.of(1985, 5, 15);
expectedEmployee.grossSalary = null;
expectedEmployee.netSalary = null;
Employee actualEmployee = new Employee();
actualEmployee.id = 3L;
actualEmployee.name = "Alice Johnson";
actualEmployee.department = "HR";
actualEmployee.homeAddress = "789 Home St";
actualEmployee.workAddress = "123 Work Ave";
actualEmployee.dateOfBirth = LocalDate.of(1985, 5, 15);
actualEmployee.grossSalary = 90000.0;
actualEmployee.netSalary = 65000.0;
Assertions.assertThat(actualEmployee)
.usingRecursiveComparison()
.ignoringExpectedNullFields()
.isEqualTo(expectedEmployee);
}
這裡,根據expectedEmployee
物件中的所有null
空白欄位對expectedEmployee and actualEmployee
物件進行比較。
六,結論
在本教程中,我們研究了 AssertJ 提供的各種方法,用於在測試中的物件比較期間忽略某些欄位。使用ignoringFields(),
ignoringFieldsMatchingRegexes()
和ignoringExpectedNullFields(),
我們可以讓我們的測驗更加靈活且易於維護。
與往常一樣,本文的完整實作可以在 GitHub 上找到。