1. 概述
AssertJ 是一个针对 Java 的断言库,它让我们能够流畅地编写断言,并使其更易于阅读。
在本教程中,我们将探讨 AssertJ 的提取方法,以在不打断测试断言流程的情况下进行流畅的检查。
2. 实现
我们从一个 Person 示例类开始:
class Person {
private String firstName;
private String lastName;
private Address address;
Person(String firstName, String lastName, Address address) {
this.firstName = firstName;
this.lastName = lastName;
this.address = address;
}
// getters and setter omitted
}
每个 Person 都会关联一个 Address:
class Address {
private String street;
private String city;
private ZipCode zipCode;
Address(String street, String city, ZipCode zipCode) {
this.street = street;
this.city = city;
this.zipCode = zipCode;
}
// getters and setter omitted
}
而每个 Address 将包含一个 ZipCode 类:
class ZipCode {
private long zipcode;
ZipCode(long zipcode) {
this.zipcode = zipcode;
}
// getters and setter omitted
}
现在假设在创建 Person 对象后,我们需要测试以下情况:
- Address 不为 null
- Address 不在受限地址列表中
- ZipCode 对象不为 null
- ZipCode 值在 1000 到 100000 之间
3. 使用 AssertJ 的常见断言
给定以下 Person 对象:
Person person = new Person("aName", "aLastName", new Address("aStreet", "aCity", new ZipCode(90210)));
我们可以提取 Address 对象:
Address address = person.getAddress();
然后我们可以断言 Address 不为 null:
assertThat(address).isNotNull();
我们还可以检查 Address 是否不在受限地址列表中:
assertThat(address).isNotIn(RESTRICTED_ADDRESSES);
下一步是检查 ZipCode:
ZipCode zipCode = address.getZipCode();
并断言它不为 null:
assertThat(zipCode).isNotNull();
最后,我们可以提取 ZipCode 值并断言其在 1000 到 100000 之间:
assertThat(zipCode.getZipcode()).isBetween(1000L, 100_000L);
上述代码直接明了,但我们在阅读时需要多行处理,还需要为后续断言分配变量,这并不是一个干净的编码体验。
4. 使用 AssertJ 的提取方法
现在让我们看看如何使用提取方法来帮助我们:
assertThat(person)
.extracting(Person::getAddress)
.isNotNull()
.isNotIn(RESTRICTED_ADDRESSES)
.extracting(Address::getZipCode)
.isNotNull()
.extracting(ZipCode::getZipcode, as(InstanceOfAssertFactories.LONG))
.isBetween(1_000L, 100_000L);
如您所见,代码并没有太大不同,但它更流畅,更容易阅读。
5. 总结
在这篇文章中,我们看到了两种提取对象值进行断言的方法:
- 提取到变量以便稍后断言
- 使用 AssertJ 的提取方法进行流畅提取
本文使用的示例可以在 GitHub 上找到。