Java 8中的覆盖率报告

8

我刚开始接触Java 8,发现很多使用流和可选对象的情况。于是就有了一个问题。考虑以下来自Oracle教程的示例:

String name = computer.flatMap(Computer::getSoundcard)
                          .flatMap(Soundcard::getUSB)
                          .map(USB::getVersion)
                          .orElse("UNKNOWN");

或下一个示例取自这里:

List<String> myList = new ArrayList();

myList
    .stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

是否有一种覆盖解决方案,可以告诉我第一个片段中的orElse是否被使用?或者其他一些解决方案,可以告诉我由于列表为空,filter闭包根本没有被调用?是否有任何报告可以表明forEach中的方法引用未被使用?


您的测试数据添加了一个没有任何值的可选项,并检查是否出现未知。 - JEY
1
orElse 调用总是会发生,它的参数在调用之前总是被评估,因此它的覆盖范围不需要评估。对于 lambda 表达式,在编译期间它们会被解糖成合成方法,因此每个最新的代码覆盖率工具都应该能够处理它们。 - Holger
3
当您在流上使用“终端”操作时,保证任何“管道”中的操作都会被执行。因此,实际上并不需要覆盖率。 - fge
3
如果列表为空,我相信String.startsWith不会被调用。 - Gábor Lipták
1个回答

1

至少Clover似乎支持闭包的覆盖率。请参阅this博客文章!

Intellij中的示例:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接