Contents

Assertj的Java 8功能

1. 概述

本文重点介绍AssertJ 的 Java8 相关特性,是该系列的第三篇文章。

如果您正在寻找有关其主要功能的一般信息,请查看AssertJ 简介 系列中的第一篇文章,然后查看AssertJ for Guava

2. Maven依赖

自版本 3.5.1 起,Java 8 的支持包含在主 AssertJ Core 模块中。为了使用该模块,您需要在pom.xml文件中包含以下部分:

<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.5.1</version>
    <scope>test</scope>
</dependency>

此依赖项仅涵盖基本的 Java 断言。如果要使用高级断言,则需要单独添加其他模块。 最新的核心版本可以在这里 找到。

3.Java 8 特性

AssertJ 通过为 Java 8 类型提供特殊的帮助方法和新的断言来利用 Java 8 的特性。

3.1. Optional断言

让我们创建一个简单的Optional实例:

Optional<String> givenOptional = Optional.of("something");

我们现在可以轻松地检查Optional是否包含某个值以及包含的值是什么:

assertThat(givenOptional)
  .isPresent()
  .hasValue("something");

3.2. Predicate断言

让我们通过检查String的长度来创建一个简单的Predicate实例:

Predicate<String> predicate = s -> s.length() > 4;

现在您可以轻松地检查哪些StringPredicate 拒绝或接受:

assertThat(predicate)
  .accepts("aaaaa", "bbbbb")
  .rejects("a", "b")
  .acceptsAll(asList("aaaaa", "bbbbb"))
  .rejectsAll(asList("a", "b"));

3.3. LocalDate断言

让我们从定义两个LocalDate对象开始:

LocalDate givenLocalDate = LocalDate.of(2016, 7, 8);
LocalDate todayDate = LocalDate.now();

您现在可以轻松检查给定日期是在给定日期之前/之后还是今天:

assertThat(givenLocalDate)
  .isBefore(LocalDate.of(2020, 7, 8))
  .isAfterOrEqualTo(LocalDate.of(1989, 7, 8));
assertThat(todayDate)
  .isAfter(LocalDate.of(1989, 7, 8))
  .isToday();

3.4. LocalDateTime断言

LocalDateTime断言的工作方式与LocalDate的类似,但不共享isToday方法。

让我们创建一个示例LocalDateTime对象:

LocalDateTime givenLocalDate = LocalDateTime.of(2016, 7, 8, 12, 0);

现在您可以检查:

assertThat(givenLocalDate)
  .isBefore(LocalDateTime.of(2020, 7, 8, 11, 2));

3.5. LocalTime断言

LocalTime断言的工作方式与其他 java.util.time.* 断言类似,但它们确实有一个专有方法:hasSameHourAs

让我们创建一个示例LocalTime对象:

LocalTime givenLocalTime = LocalTime.of(12, 15);

现在你可以断言:

assertThat(givenLocalTime)
  .isAfter(LocalTime.of(1, 0))
  .hasSameHourAs(LocalTime.of(12, 0));

3.6. FlatExtracting辅助方法

FlatExtracting是一种特殊的实用方法,它利用 Java 8 的 lambdas 从Iterable元素中提取属性。

让我们用LocalDate对象创建一个简单的List

List<LocalDate> givenList = asList(ofYearDay(2016, 5), ofYearDay(2015, 6));

现在我们可以轻松地检查这个List是否包含至少一个LocalDate对象,年份为 2015:

assertThat(givenList)
  .flatExtracting(LocalDate::getYear)
  .contains(2015);

flatExtracting方法并不限制我们进行字段提取。我们总是可以为它提供任何功能:

assertThat(givenList)
  .flatExtracting(LocalDate::isLeapYear)
  .contains(true);

甚至:

assertThat(givenList)
  .flatExtracting(Object::getClass)
  .contains(LocalDate.class);

您还可以一次提取多个属性:

assertThat(givenList)
  .flatExtracting(LocalDate::getYear, LocalDate::getDayOfMonth)
  .contains(2015, 6);

3.7. Satisfies辅助方法

Satisfies方法允许您快速检查对象是否满足所有提供的断言。

让我们创建一个示例String实例:

String givenString = "someString";

现在我们可以将断言作为 lambda 主体提供:

assertThat(givenString)
  .satisfies(s -> {
    assertThat(s).isNotEmpty();
    assertThat(s).hasSize(10);
  });

3.8. HasOnlyOneElement 辅助方法

HasOnlyOneElement辅助方法允许检查Iterable实例是否仅包含一个满足提供的断言的元素。

让我们创建一个示例List

List<String> givenList = Arrays.asList("");

现在你可以断言:

assertThat(givenList)
  .hasOnlyOneElementSatisfying(s -> assertThat(s).isEmpty());

3.9. Matches辅助方法

Matches辅助方法允许检查给定对象是否与给定Predicate函数匹配。

让我们取一个字符串:

String emptyString = "";

现在我们可以通过提供足够的Predicate lambda 函数来检查它的状态:

assertThat(emptyString)
  .matches(String::isEmpty);