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

2023-12-08

我在 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(使用前将#替换为@)

EclEmma、Java8 和 Lambda - 不涉及 lambda 表达式 的相关文章

随机推荐