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 类型的自定义断言:ByteSource、Multimap、Optional、Range、RangeMap和Table。
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");
如您所见,mmap1和mmap1_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");