当前位置: 首页 > 知识库问答 >
问题:

EclEmma、Java8和Lambda——没有关于Lambda表达式的报道

郜彦
2023-03-14

我在Eclipse Luna下有一个Java项目,EclEmma2.3.1.201405111647(最新),使用Jacoco 0.7.1,支持Java8,如他们的变更日志所述:

“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方法中来证明这一点,并用(V值:Iterable

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

  • BLOCK0都是绿色的
  • BLOCK1都是绿色的
  • BLOCK2是绿色的,直到的每个(单元-

有人能解释一下为什么雅各科不能检测到λ的覆盖率吗?


共有1个答案

壤驷德寿
2023-03-14

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

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

修正了错误

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

这似乎解决了您的问题。因为您使用的是EclEmma2.3.1,它使用的是JaCoCo版本0.7.1,所以您只需要更新一下。

 类似资料:
  • 1 Java8 Lambda表达式的介绍 Lambda表达式是Java8中包含的一项新的重要功能。它提供了一种简洁明了的方式来使用表达式表示一个方法接口。在Collection集合中非常有用。它有助于集合元素的迭代,过滤和从集合中提取数据。 Lambda表达式用于提供具有功能接口的接口的实现。它节省了大量代码。在使用Lambda表达式的情况下,我们无需再次定义用于提供实现的方法。我们只编写实现代码

  • Lambda表达式在Java 8中引入,并被吹捧为Java 8的最大特性.Lambda表达式有助于函数式编程,并简化了很多开发。 语法 (Syntax) lambda表达式的特征在于以下语法。 parameter -> expression body 以下是lambda表达式的重要特征。 Optional type declaration - 无需声明参数类型。 编译器可以从参数的值推断出相同的

  • 我正在玩Java 8,遇到了一个基本的场景,它展示了一个第22条军规,即修复一个编译错误会导致另一个编译错误。场景(这只是一个从更复杂的东西简化而来的例子): 我收到编译错误: 封闭范围中定义的局部变量结果必须是最终的或有效的最终结果 如果我将第一行更改为: 最后一行出现编译错误: 局部变量结果可能尚未初始化 似乎这里唯一的方法是将我的结果预先初始化为ArrayList,我不想这样做,或者不使用l

  • (译注:目前支持lambda的gcc编译器版本为4.5,其它详细的编译器对于C++11新特性的支持请参考http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport) Lambda表达式是一种描述函数对象的机制,它的主要应用是描述某些具有简单行为的函数(译注:Lambda表达式也可以称为匿名函数,具有复杂行为的函数可以采用命名函数对象,当然,何谓复杂

  • 本文向大家介绍Java8之lambda表达式基本语法,包括了Java8之lambda表达式基本语法的使用技巧和注意事项,需要的朋友参考一下 lambda表达式,即带有参数的表达式,为更清晰地理解lambda表达式,先看如下例子: (1) (1)中代码调用Collections.sort方法对集合进行排序,其中第二个参数是一个类,准确地说是一个匿名内部类,sort方法调用内部类中的compare方法

  • 本文向大家介绍Java8 Lambda表达式详解及实例,包括了Java8 Lambda表达式详解及实例的使用技巧和注意事项,需要的朋友参考一下 第一个Lambda表达式 在Lambda出现之前,如果我们需要写一个多线程可能需要下面这种方式: 上面的例子如果改成使用Lambda就会简单许多: Lambda表达式是一个匿名函数,将行为像数据一样传递,表达式使用 -> 将参数和主体分开, -> 前面是参