Contents

AssertJ 与 Guava

1. 概述

本文重点介绍AssertJ Guava 相关的断言,是 AssertJ 系列的第二篇文章。如果您想了解有关 AssertJ 的一般信息,请查看 AssertJ简介 系列中的第一篇文章。

2. Maven依赖

为了将 AssertJ 与 Guava 一起使用,您需要将以下依赖项添加到您的pom.xml中:

<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-guava</artifactId>
    <version>3.0.0</version>
    <scope>test</scope>
</dependency>

您可以在此处 找到最新版本。

请注意,从 3.0.0 版开始,AssertJ Guava依赖于Java 8和AssertJ Core 3.x

3. Guava 断言

AssertJ具有 Guava 类型的自定义断言:ByteSourceMultimapOptionalRangeRangeMapTable

3.1. ByteSource断言

让我们从创建两个空的临时文件开始:

File temp1 = File.createTempFile("bael", "dung1");
File temp2 = File.createTempFile("bael", "dung2");

并从中创建ByteSource实例:

ByteSource byteSource1 = Files.asByteSource(temp1);
ByteSource byteSource2 = Files.asByteSource(temp2);

现在我们可以编写以下断言:

assertThat(buteSource1)
  .hasSize(0)
  .hasSameContentAs(byteSource2);

3.2. Multimap断言

Multimap是可以将多个值与给定键关联的映射。Multimap断言的工作方式与普通Map实现非常相似。

让我们首先创建一个Multimap实例并添加一些条目:

Multimap<Integer, String> mmap = Multimaps
  .newMultimap(new HashMap<>(), Sets::newHashSet);
mmap.put(1, "one");
mmap.put(1, "1");

现在我们可以断言:

assertThat(mmap)
  .hasSize(2)
  .containsKeys(1)
  .contains(entry(1, "one"))
  .contains(entry(1, "1"));

还有两个额外的断言可用——它们之间有细微的区别:

  • containsAllEntriesOf
  • hasSameEntriesAs

让我们看看这两个断言;我们将从定义一些地图开始:

Multimap<Integer, String> mmap1 = ArrayListMultimap.create();
mmap1.put(1, "one");
mmap1.put(1, "1");
mmap1.put(2, "two");
mmap1.put(2, "2");
Multimap<Integer, String> mmap1_clone = Multimaps
  .newSetMultimap(new HashMap<>(), HashSet::new);
mmap1_clone.put(1, "one");
mmap1_clone.put(1, "1");
mmap1_clone.put(2, "two");
mmap1_clone.put(2, "2");
Multimap<Integer, String> mmap2 = Multimaps
  .newSetMultimap(new HashMap<>(), HashSet::new);
mmap2.put(1, "one");
mmap2.put(1, "1");

如您所见,mmap1mmap1_clone包含完全相同的条目,但是是两种不同Map类型的两个不同对象。Map mmap2包含一个在所有地图之间共享的条目。现在以下断言成立:

assertThat(mmap1)
  .containsAllEntriesOf(mmap2)
  .containsAllEntriesOf(mmap1_clone)
  .hasSameEntriesAs(mmap1_clone);

3.3. Optional断言

Guava 的Optional的断言涉及值存在检查和用于提取内部值的实用程序。

让我们从创建一个Optional实例开始:

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

现在我们可以检查值的存在并断言Optional的内容:

assertThat(something)
  .isPresent()
  .extractingValue()
  .isEqualTo("something");

3.4. Range断言

Guava 的Range类的断言涉及检查Range的下限和上限,或者某个值是否在给定范围内。

让我们通过执行以下操作来定义一个简单的字符范围:

Range<String> range = Range.openClosed("a", "g");

现在我们可以测试:

assertThat(range)
  .hasOpenedLowerBound()
  .isNotEmpty()
  .hasClosedUpperBound()
  .contains("b");

3.5. Table断言

AssertJ 的特定于表的断言允许检查行数和列数以及单元格值的存在。

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

Table<Integer, String, String> table = HashBasedTable.create(2, 2);
table.put(1, "A", "PRESENT");
table.put(1, "B", "ABSENT");

现在我们可以执行以下检查:

assertThat(table)
  .hasRowCount(1)
  .containsValues("ABSENT")
  .containsCell(1, "B", "ABSENT");