2

変更ログに記載されているように Java 8 をサポートする Jacoco 0.7.1 を使用する EclEmma 2.3.1.201405111647 (最新) を使用して、Eclipse Luna の下に Java プロジェクトがあります。

「バージョン 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% カバーされることがわかっているので、ここでは行いません。appendToStringラムバ式をメソッドに移動forEachし、for-each に置き換えることで証明できますfor (V value : Iterable<V>)

結果は、「Junit テストとしてのカバレッジ」を実行すると、次のようになります。

  • BLOCK0 はすべて緑色です
  • BLOCK1 はすべて緑色です
  • BLOCK2 は緑色で、forEach(unit -> {
  • BLOCK3 は白 (無視された行のように)
  • BLOCK4 はすべて緑色です。

Jacoco が lambda のカバレッジを検出できない理由を誰かが説明してくれますか?

4

1 に答える 1

9

ラムダ式の本体は合成メソッドにコンパイルされますが、私が読む限り、合成メソッドはコード カバレッジ分析で無条件に除外されます。

JaCoCoの変更履歴を見るとわかります

スナップショット ビルド 0.7.2.201408210455 (2014/08/21)

修正されたバグ

Java 8 ラムダ式のコード カバレッジを取得するために合成ラムダ メソッドを無視しないでください (GitHub #232)。

あなたの問題に対処しているようです。2.3.1JaCoCo バージョンを使用している EclEmmaを使用している0.7.1ため、更新が必要です。

于 2014-09-02T16:33:09.543 に答える