gpt4 book ai didi

java-8 - EclEmma、Java8 和 Lambda - 不涉及 lambda 表达式

转载 作者:行者123 更新时间:2023-12-02 06:34:53 24 4
gpt4 key购买 nike

我在 Eclipse Luna 下有一个 Java 项目,带有 EclEmma 2.3.1.201405111647(最新),它使用 Jacoco 0.7.1,它支持 Java 8,如其 changelog 中所述。 :

"Version 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 来证明这一点方法,并替换forEachfor-each for (V value : Iterable<V>) .

结果是,当我进行“Coverage as Junit Test”时,结果如下:

  • BLOCK0 为全绿色
  • BLOCK1 为全绿色
  • BLOCK2 为绿色,一直到 forEach(unit -> {
  • BLOCK3 是白色的(就好像它是被忽略的行)
  • BLOCK4 全部呈绿色。

有人可以解释一下为什么 Jacoco 无法检测 lambda 的覆盖率吗?

最佳答案

Lambda 表达式体被编译成合成方法,但是 as far as I read ,合成方法在代码覆盖率分析中被无条件过滤掉。

通过查看Change History我看到了JaCoCo的

Snapshot Build 0.7.2.201408210455 (2014/08/21)

Fixed Bugs

Do not ignore synthetic lambda methods to get code coverage for Java 8 lambda expressions (GitHub #232).

这似乎解决了您的问题。由于您使用的是 EclEmma 2.3.1,而 EclEmma 使用的是 JaCoCo 版本 0.7.1,因此您只需要更新即可。

关于java-8 - EclEmma、Java8 和 Lambda - 不涉及 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25627582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com