[Jacoco在运行单元测试时在我的界面中添加了一个$ jacocoInit方法

问题描述 投票:1回答:1

在接口中添加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方法。我不确定为什么会这样吗?有人可以帮忙吗?

java jacoco
1个回答
3
投票

根据JaCoCo FAQ

为了收集执行数据,JaCoCo会测试被测类,这将两个成员添加到类中:私有静态字段$jacocoData和私有静态方法$jacocoInit()。这两个成员都标记为合成。

请更改您的代码以忽略合成成员。无论如何,这都是一个好习惯,因为Java编译器还会在某些情况下创建综合成员。

Method isSynthetic of class java.lang.reflect.Method

如果此可执行文件是合成结构,则返回true;否则,返回true。否则返回false。

因此要忽略合成成员:

isSynthetic

这是Java编译器创建合成方法的许多示例之一:

java.lang.reflect.Method

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

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

生产

1.8.0_152

这里是javac Example.java java Example

未出现在源代码中的类成员必须使用Synthetic属性进行标记,[...]

您可以在name: m isSynthetic: false name: lambda$static$0 isSynthetic: true Java Virtual Machine Specification states about synthetic members中阅读有关JaCoCo实现的更多信息,其中还包括其他一些合成构造的示例。

© www.soinside.com 2019 - 2024. All rights reserved.