Jacoco добавляет метод $ jacocoInit в мой интерфейс при запуске модульных тестов - PullRequest
1 голос
/ 25 сентября 2019

Я получаю ненужный метод $ jacocoInit при добавлении метода defaut в интерфейс.Мой интерфейс выглядит так:

@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.Я не уверен, почему это происходит?Может кто-нибудь помочь в этом?

1 Ответ

3 голосов
/ 27 сентября 2019

Согласно Часто задаваемым вопросам JaCoCo :

Для сбора данных выполнения JaCoCo анализирует тестируемые классы, которые добавляют в класс двух членов: личное статическое поле $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 Virtual Machine говорится о синтетических членах :

Член класса, который не отображается в исходном коде, должен быть помечен с использованием атрибута Synthetic, [...]

Подробнее о реализации JaCoCo можно прочитать в его документация и презентации, сделанные командой JaCoCo , которые также включают некоторые другие примеры синтетических конструкций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...