EclEmma,Java8和Lambda - 没有关于lambda表达式的报道

NoD*_*und 2 java-8 jacoco eclemma

我在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.
Run Code Online (Sandbox Code Playgroud)

我现在有以下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();
  }
Run Code Online (Sandbox Code Playgroud)

我不会进行Junit测试,因为我知道它的覆盖范围是100%.我可以通过将lamdba表达式移动到一个appendToString方法中来证明它,并forEachfor-each重新加入 for (V value : Iterable<V>).

结果是,当我做"覆盖率作为Junit测试"时,以下内容:

  • BLOCK0全是绿色的
  • BLOCK1全是绿色的
  • BLOCK2是绿色的,直到 forEach(unit -> {
  • BLOCK3是白色的(好像被忽略了一行)
  • BLOCK4全是绿色的.

有人能解释一下为什么Jacoco无法检测到lambda的覆盖范围吗?

Hol*_*ger 9

Lambda表达式主体被编译成合成方法,但据我所知,合成方法在代码覆盖率分析中被无条件过滤掉.

通过查看JaCoCo 的变更历史,我看到了

Snapshot Build 0.7.2.201408210455(2014/08/21)

修复了错误

不要忽略合成的lambda方法来获取Java 8 lambda表达式的代码覆盖率(GitHub#232).

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