【发布时间】:2016-02-24 09:56:29
【问题描述】:
我刚刚开始使用 Java 8。我看到了很多流和可选项。一个问题突然出现在我的脑海中。考虑以下取自this oracle tutorial 的示例:
String name = computer.flatMap(Computer::getSoundcard)
.flatMap(Soundcard::getUSB)
.map(USB::getVersion)
.orElse("UNKNOWN");
或者下一张取自here:
List<String> myList = new ArrayList();
myList
.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
是否有任何覆盖解决方案,可以告诉我是否使用了第一个 sn-p 中的orElse?或者其他一些,它告诉我 filter 闭包根本没有被调用,因为列表是空的?任何人都可以报告forEach 中的方法引用没有被使用吗?
【问题讨论】:
-
用于您的测试的数据添加 un optional 没有任何值,并检查未知出现。
-
orElse调用将始终发生,并且它的参数始终在调用发生之前进行评估,因此它的覆盖范围不需要评估。在 lambda 表达式的情况下,它们在编译期间被分解为合成方法,因此每个最新的代码覆盖率也应该能够处理它们。 -
当您在流上使用“终端”操作时,可以保证“管道”中的任何操作都会被命中。所以实际上不需要覆盖。
-
@fge: 如果列表为空,我很确定不会调用 String.startsWith。
标签: java unit-testing java-8 code-coverage