在Java中使用AssertJ提取值

2023/05/12

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不为空
  • 该Address不在受限地址列表中
  • ZipCode对象不为空
  • 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不为空:

assertThat(address).isNotNull();

我们还可以检查该Address是否不在受限地址列表中:

assertThat(address).isNotIn(RESTRICTED_ADDRESSES);

下一步是检查ZipCode:

ZipCode zipCode = address.getZipCode();

并断言它不为空:

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上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章