我在Eclipse Luna下有一个Java项目,使用EclEmma 2.3.1.201405111647(最新版),它使用Jacoco 0.7.1,它们支持Java 8,如changelog中所述:
“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
方法来证明这一点,并使用 for-each forEach
重新设置for (V value : Iterable<V>)
。
结果是,当我做“覆盖为Junit测试”时,以下内容:
forEach(unit -> {
有人可以解释为什么Jacoco无法检测到lambda的覆盖范围吗?
答案 0 :(得分:8)
Lambda表达式主体被编译为合成方法,但as far as I read,合成方法在代码覆盖率分析中被无条件过滤掉。
通过查看JaCoCo的Change History我看到了
Snapshot Build 0.7.2.201408210455(2014/08/21)
修正错误
不要忽略合成的lambda方法来获取Java 8 lambda表达式的代码覆盖率(GitHub#232)。
似乎解决了你的问题。由于您使用的是使用JaCoCo版本2.3.1
的EclEmma 0.7.1
,您只需要更新。