Java 8 EclEmma、Java8和Lambda-Lambda表达式没有覆盖范围
我在Eclipse Luna下有一个Java项目,EclEmma 2.3.1.201405111647(最新版本),它使用Jacoco 0.7.1,它支持Java 8,如下所述: “版本2.3.1(2014/05/11) 我现在有以下toString:Java 8 EclEmma、Java8和Lambda-Lambda表达式没有覆盖范围,java-8,jacoco,eclemma,Java 8,Jacoco,Eclemma,我在Eclipse Luna下有一个Java项目,EclEmma 2.3.1.201405111647(最新版本),它使用Jacoco 0.7.1,它支持Java 8,如下所述: “版本2.3.1(2014/05/11) 我现在有以下toString: @Override public String toString() { // [BLOCK0] if (0 == value) { return "0B"; } // [BLOCK1]
@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
替换为for eachfor(V值:Iterable)
结果是,当我执行“作为Junit测试的覆盖率”时,会出现以下情况:
- BLOCK0是绿色的
- BLOCK1是绿色的
- BLOCK2为绿色,直到
forEach(单元->{
- BLOCK3是白色的(就好像它被忽略了一样)
- BLOCK4是绿色的
有人能解释一下为什么Jacoco不能检测lambda中的覆盖率吗?lambda表达式体被编译成合成方法,但是合成方法在代码覆盖率分析中被无条件过滤掉 通过看JaCoCo的照片我明白了 快照构建0.7.2.201408210455(2014/08/21) 修复了bug 不要忽略合成lambda方法来获得Java8lambda表达式(GitHub#232)的代码覆盖率
这似乎解决了您的问题。由于您使用的是EclEmma
2.3.1
,它使用的是JaCoCo版本0.7.1
,您只需更新即可。EclEmma eclipse updatesite/marketplace似乎尚未更新到此版本,因此您必须手动下载并安装
@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();
}