我在 Eclipse Luna 下有一个 Java 项目,使用 EclEmma 2.3.1.201405111647(最新),它使用 Jacoco 0.7.1,它支持 Java 8,如其变更日志:
》2.3.1版本(2014/05/11)
Fixed ASM 5.0.1 dependency conflicts with new ASM bundles in Eclipse 4.4 (GitHub #83).
Upgrade to JaCoCo 0.7.1 for full Java 8 support.
我现在有以下 toString:
@Override
public String toString() {
// [BLOCK0]
if (0 == value) {
return "0B";
}
// [BLOCK1]
final MutableLong val = new MutableLong(value);
final StringBuilder sb = new StringBuilder();
// [BLOCK2]
Arrays.asList(TERA_BYTES, GIGA_BYTES, MEGA_BYTES, KILO_BYTES, BYTES).forEach(unit -> {
// [BLOCK3]
long divider = unit.toBytes(1);
long n = val.longValue() / divider;
if (0 != n) {
sb.append(n).append(unit.getUnitCharacter());
val.subtract(n * divider);
}
});
// [BLOCK4]
return sb.toString();
}
我不会进行 Junit 测试,因为我知道它的覆盖率是 100%。我可以通过将 lamdba 表达式移动到appendToString
方法,并替换forEach
with a for-each for (V value : Iterable<V>)
.
结果是,当我进行“Coverage as Junit Test”时,结果如下:
- BLOCK0全绿
- BLOCK1全绿
- BLOCK2 为绿色,直到
forEach(unit -> {
- BLOCK3 是白色的(就好像它被忽略了)
- BLOCK4 是全绿色的。
有人可以解释一下为什么 Jacoco 无法检测 lambda 的覆盖范围吗?
Lambda 表达式体被编译成合成方法,但是据我所知,合成方法在代码覆盖率分析中被无条件过滤掉。
通过查看变更历史记录我看到了JaCoCo
快照版本0.7.2.201408210455 (2014/08/21)
修复错误
不要忽略合成 lambda 方法来获取 Java 8 lambda 表达式的代码覆盖率 (GitHub #232)。
这似乎解决了你的问题。由于您正在使用 EclEmma2.3.1
这是使用 JaCoCo 版本0.7.1
你只需要更新。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)