我在 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
用for-each for (V value : Iterable<V>)
替换。
结果是,当我执行“覆盖作为 Junit 测试”时,以下内容:
- BLOCK0 全是绿色
- BLOCK1 全是绿色
- BLOCK2 为绿色,直至
forEach(unit -> {
- BLOCK3 是白色的(好像它是被忽略的行)
- BLOCK4 全是绿色的。
有人可以解释一下为什么 Jacoco 无法检测到 lambda 的覆盖率吗?