TL;DR 最佳整体方法是由 Ole V. V. 提出的:
assertEquals(Optional.of("expected"), opt);
下面讨论其他替代方案。
有几种不同的方法可以做到这一点,具体取决于您对测试结果的清晰性和测试写作的简洁性的喜好。对于这个答案,我将坚持使用“库存”Java 8 和 JUnit 4,没有其他依赖项。
正如comment by Ole V.V. 中所建议的那样,一种方法就是简单地写
assertEquals("expected", opt.get());
这通常有效,但如果 Optional 为空,则 get() 将抛出 NoSuchElementException。这反过来会导致 JUnit 发出错误而不是失败的信号,这可能不是您想要的。除非您已经知道 get() 在这种情况下抛出 NSEE,否则也不太清楚发生了什么。
另一种选择是
assertTrue(opt.isPresent() && "expected".equals(opt.get()));
这也很有效,但如果存在不匹配,它不会报告实际值,这可能会给调试带来不便。
另一种选择是
assertEquals("expected", opt.orElseThrow(AssertionFailedError::new));
这会给出正确的失败并在不匹配时报告实际值,但对于抛出AssertionFailedError 的原因并不是很明确。您可能不得不盯着它看一会儿,直到您意识到当 Optional 为空时会抛出 AFE。
还有一个选择是
assertEquals("expected", opt.orElseThrow(() -> new AssertionFailedError("empty")));
但这开始变得冗长了。
你可以把它分成两个断言,
assertTrue(opt.isPresent());
assertEquals("expected", opt.get());
但您之前曾因为冗长而反对this suggestion。在我看来,这并不是非常冗长,但它确实有一些认知开销,因为有两个单独的断言,并且它依赖于仅在第一个成功时检查第二个。这并没有错,但有点微妙。
最后,如果您愿意创建一些您自己的基础架构,您可以创建一个适当命名的AssertionFailedError 子类并像这样使用它:
assertEquals("expected", opt.orElseThrow(UnexpectedEmptyOptional::new));
最后,在另一条评论中,Ole V. V. 建议
assertEquals(Optional.of("correct"), opt);
这很好用,事实上这可能是最好的。