1. 概述

当我们测试返回Optional对象的方法时,可能需要编写检查Optional是否有值或其内部值的断言。在这篇简短教程中,我们将探讨如何使用JUnitAssertJ库中的函数来编写这些断言。

2. 检查Optional是否为空或有值

如果我们只需要知道Optional是否有值,可以对isPresent()isEmpty()进行断言。

2.1. 测试Optional有值

如果Optional有值,我们可以使用Optional.isPresent()进行断言:

assertTrue(optional.isPresent());

然而,AssertJ库提供了更流畅的表达方式:

assertThat(optional).isNotEmpty();

2.2. 测试Optional是否为空

在使用JUnit时,我们可以反转逻辑:

assertFalse(optional.isPresent());

从Java 11开始,我们还可以使用Optional.isEmpty()

assertTrue(optional.isEmpty());

然而,AssertJ也提供了简洁的替代方案:

assertThat(optional).isEmpty();

3. 测试Optional的值

通常,我们希望测试Optional内的值,而不仅仅是存在与否。

3.1. 使用JUnit断言

我们可以使用Optional.get()获取值,然后对其写入断言:

Optional<String> optional = Optional.of("SOMEVALUE");
assertEquals("SOMEVALUE", optional.get());

然而,使用get()可能会引发异常,使得测试失败的排查变得困难。因此,我们可能更喜欢先验证值是否存在:

assertTrue(optional.isPresent());
assertEquals("SOMEVALUE", optional.get());

但请注意,Optional支持equals方法,因此我们可以将带有正确值的Optional用作一般相等性断言的一部分:

Optional<String> expected = Optional.of("SOMEVALUE");
Optional<String> actual = Optional.of("SOMEVALUE");
assertEquals(expected, actual);

3.2. 使用AssertJ

AssertJ中,我们可以使用hasValue流畅断言:

assertThat(Optional.of("SOMEVALUE")).hasValue("SOMEVALUE");

4. 总结

在这篇文章中,我们探讨了几种测试Optional的方法。我们看到了如何使用内置的JUnit断言与isPresent()get()一起工作。还了解到Optional.equals()为我们提供了一种在断言中比较Optional对象的方式。

最后,我们了解了AssertJ断言,它为我们提供了检查Optional值的流畅语言。如往常一样,本文中的代码可在GitHub上找到。