1. 概述
当我们测试返回Optional
对象的方法时,可能需要编写检查Optional
是否有值或其内部值的断言。在这篇简短教程中,我们将探讨如何使用JUnit
和AssertJ
库中的函数来编写这些断言。
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上找到。