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 上找到。