AssertJ 3.12.0リリースされたので新機能試してみた

AssertJ 3.12.0が2019/2/14にリリースされました。これに伴ってユーザガイドがリニューアルされました。

新機能いくつか試してみました。

ネストしたオブジェクトの検証

AbstractObjectAssert#usingRecursiveComparison() を呼ぶことでネストしたオブジェクトの検証ができます。

@Test
void nestObjectFieldAssertions() {
    Address address1 = new Address("東京都", "千代田区千代田");
    Person person1 = new Person("内立", 20, address1);

    Address address2 = new Address("東京都", "渋谷区東");
    Person person2 = new Person("良介", 20, address2);

    Address address3 = new Address("東京都", null);
    Person person3 = new Person(null, 20, address3);

    // 指定したフィールドを無視する
    Assertions.assertThat(person1).usingRecursiveComparison()
        .ignoringFields("name", "address.following")
        .isEqualTo(person2);
    Assertions.assertThat(person1).usingRecursiveComparison()
        .ignoringFields("name", "address")
        .isEqualTo(person2);

    // nullのフィールドを無視する
    Assertions.assertThat(person3).usingRecursiveComparison()
        .ignoringActualNullFields()
        .isEqualTo(person1);
}

指定した1要素だけのListであることの検証

AbstractIterableAssert#hasOnlyOneElementSatisfying(Consumer elementAssertions) を使う。

@Test
void hasOnlyOneElementSatisfying() {
    List<Brand> brands = List.of(new Brand("ETHOSENS", "Hashimoto", Gender.MAN));
    assertThat(brands)
        .hasOnlyOneElementSatisfying(brand -> {
            assertThat(brand.getName()).isEqualTo("ETHOSENS");
            assertThat(brand.getDesigner()).isEqualTo("Hashimoto");
            assertThat(brand.getGender()).isEqualTo(Gender.MAN);
        });
}

全フィールドがnullであることの検証

AbstratObjectAssert#hasAllNullFieldsOrProperties() を使います。 AbstratObjectAssert#hasAllNullFieldsOrPropertiesExcept(String... propertiesOrFieldsToIgnore) を使うと、無視するフィールドを指定することができます。

@Test
void hasAllNullFieldsOrPropertiesAssertion() {
    Brand ethosens = new Brand(null, null, null);
    Assertions.assertThat(ethosens)
        .hasAllNullFieldsOrProperties();
    Assertions.assertThat(ethosens)
        .hasAllNullFieldsOrPropertiesExcept();

    Brand bedsidedrama = new Brand("bedsidedrama", "Tanita", null);
    // 指定したフィールドは無視される
    Assertions.assertThat(bedsidedrama)
        .hasAllNullFieldsOrPropertiesExcept("name", "designer");
}

Listサイズの検証

@Test
void hasSizeAssertion() {
    Brand stof = new Brand("stof", "Tanita", Gender.MAN);
    Brand bedsidedrama = new Brand("bedsidedrama", "Tanita", Gender.MAN);
    Brand ethosens = new Brand("ETHOSENS", "Hashimoto", Gender.MAN);
    List<Brand> brands = List.of(stof, bedsidedrama, ethosens);

    Assertions.assertThat(brands)
        .hasSizeGreaterThan(1)
        .hasSizeLessThan(4)
        .hasSizeGreaterThanOrEqualTo(3)
        .hasSizeLessThanOrEqualTo(3)
        .hasSizeBetween(1,4);
}

Mapに含まれる全要素が一致することの検証

AbstractMapAssert#containsAllEntriesOf(Map other) を使う。

@Test
void containsExactlyEntriesOfAssertion() {
    Map<Integer, String> map1 = Map.of(1, "TEST1", 2, "TEST2");
    Map<Integer, String> map2 = Map.of(1, "TEST1", 2, "TEST2");
    Assertions.assertThat(map1).containsAllEntriesOf(map2);
}

指定したkeyのみ含まれていること

AbstractMapAssert#containsOnlyKeys(Iterable keys) を使う。

@Test
void containsOnlyKeysAssertion() {
    Map<Integer, String> map1 = Map.of(1, "TEST1", 2, "TEST2");
    Assertions.assertThat(map1).containsOnlyKeys(List.of(1, 2));
}

一番の目玉はネストしたオブジェクトの検証ができるようになったことです!!