Jacoco es la adición de un método $ jacocoInit en mi interfaz al ejecutar pruebas unitarias

hatellla:

Estoy recibiendo un método innecesaria $ jacocoInit al añadir el método defaut en la interfaz. Mi interfaz se parece a esto:

@Value.Immutable
public interface Customer {


    Optional<@NotBlank String> name();

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

    default void getObject() {

    }
}

Cuando estoy haciendo

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

entonces, me estoy haciendo

name
getObject
$jacocoInit

Si quito el método por defecto de ella, entonces no hace $ jacocInit método. No estoy seguro de por qué está sucediendo? Por favor alguien puede ayudar en esto?

Godin:

De acuerdo con JaCoCo FAQ :

Para los instrumentos de ejecución de datos JaCoCo cobrar las clases bajo prueba que se suma a dos miembros de las clases: Un campo estático privada $jacocoDatay un método estático privada $jacocoInit(). Ambos miembros están marcados como sintético.

Por favor, cambiar el código para ignorar los miembros sintéticos. Esta es una práctica buena de todos modos como también el compilador Java crea miembros sintéticos en cierta situación.

Método isSyntheticde la clasejava.lang.reflect.Method

Devuelve true si este ejecutable es una construcción sintética; devuelve false en caso contrario.

Así que hacer caso omiso de los miembros de síntesis:

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

Y aquí es uno de los muchos ejemplos en los que el compilador Java crea método sintético:

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();
        }
    }
}

El uso de JDK 1.8.0_152ejecución de

javac Example.java
java Example

produce

name: m
isSynthetic: false

name: lambda$static$0
isSynthetic: true

Y aquí es lo que Java Virtual Machine especificación establece sobre los miembros de síntesis :

Un miembro de la clase que no aparece en el código fuente deberá ser marcado con un atributo sintético, [...]

Puede leer más sobre la implementación JaCoCo en su documentación y en las presentaciones realizadas por el equipo de JaCoCo , que también incluyen otros ejemplos de construcciones sintéticas.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=333525&siteId=1
Recomendado
Clasificación