Java 8 EclEmma、Java8和Lambda-Lambda表达式没有覆盖范围

Java 8 EclEmma、Java8和Lambda-Lambda表达式没有覆盖范围,java-8,jacoco,eclemma,Java 8,Jacoco,Eclemma,我在Eclipse Luna下有一个Java项目,EclEmma 2.3.1.201405111647(最新版本),它使用Jacoco 0.7.1,它支持Java 8,如下所述: “版本2.3.1(2014/05/11) 我现在有以下toString: @Override public String toString() { // [BLOCK0] if (0 == value) { return "0B"; } // [BLOCK1]

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

“版本2.3.1(2014/05/11)

我现在有以下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值:Iterable)

结果是,当我执行“作为Junit测试的覆盖率”时,会出现以下情况:

  • BLOCK0是绿色的
  • BLOCK1是绿色的
  • BLOCK2为绿色,直到
    forEach(单元->{
  • BLOCK3是白色的(就好像它被忽略了一样)
  • BLOCK4是绿色的

有人能解释一下为什么Jacoco不能检测lambda中的覆盖率吗?

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

通过看JaCoCo的照片我明白了

快照构建0.7.2.201408210455(2014/08/21) 修复了bug

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


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

EclEmma eclipse updatesite/marketplace似乎尚未更新到此版本,因此您必须手动下载并安装
  @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();
  }