ユニットテストを実行するときJacocoは私のインターフェースで$ jacocoInitメソッドを追加しています

hatellla:

インターフェイスにdefautメソッドを追加するとき、私は、不要なメソッドの$ jacocoInitを取得しています。私のインターフェイスは、次のようになります。

@Value.Immutable
public interface Customer {


    Optional<@NotBlank String> name();

    default Object getObject(final String abc) {
        return null
    }

    default void getObject() {

    }
}

私がやっているとき

for (Method method : Customer.class.getDeclaredMethods()) {
    System.out.println(method.getName());
}

そして、私が取得しています

name
getObject
$jacocoInit

私はそれから、デフォルトのメソッドを削除した場合、それは$メソッドをjacocInitしません。それが起こっている私はなぜわかりませんか?誰かがこの中に助けを喜ばせることはできますか?

ゴダン:

よるとJaCoCoよくある質問

収集実行データJaCoCo機器へのクラスに2人のメンバーを追加し、テスト対象のクラス:プライベート静的フィールド$jacocoDataとプライベート静的メソッド$jacocoInit()どちらのメンバーは、合成としてマークされています。

合成メンバーを無視するようにコードを変更してください。これはとにかくとしても、Javaコンパイラは、特定の状況で合成メンバーを作成することをお勧めします。

メソッドisSyntheticクラスのjava.lang.reflect.Method

trueを返し、この実行ファイルは、合成構造である場合には、それ以外の場合はfalseを返します。

だから、合成メンバーを無視します:

for (Method method : Customer.class.getDeclaredMethods()) {
    if (method.isSynthetic()) {
        continue;
    }
    System.out.println(method.getName());
}

そして、ここでJavaコンパイラは、合成方法を作成し、多くの例の一つであります:

import java.lang.reflect.*;

class Example {

    interface I {
        Runnable r = () -> {}; // lambda

        void m();
    }

    public static void main(String[] args) {
        for (Method method : I.class.getDeclaredMethods()) {
            System.out.println("name: " + method.getName());
            System.out.println("isSynthetic: " + method.isSynthetic());
            System.out.println();
        }
    }
}

JDKの使用1.8.0_152の実行を

javac Example.java
java Example

生成

name: m
isSynthetic: false

name: lambda$static$0
isSynthetic: true

そして、ここで何であるJava仮想マシン仕様は、合成メンバーについて述べています

ソースコードに表示されていないクラスのメンバーが合成属性を使用してマークする必要があり、[...]

あなたにはJaCoCoの実装の詳細を読むことができ、そのマニュアルやでJaCoCoチームによって行われたプレゼンテーションも合成構造の他のいくつかの例を含みます、。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=333522&siteId=1