Java 不包括STS内Emma中的合成类

Java 不包括STS内Emma中的合成类,java,code-coverage,emma,spring-tool-suite,eclemma,Java,Code Coverage,Emma,Spring Tool Suite,Eclemma,当尝试运行Coverage as或使用emma:emma运行maven构建时,我得到以下信息: java.lang.IllegalStateException:无法访问方法:无法设置 静态最终[Z]字段packageName.ClassName.$jacocdata到[Z] 因此,我在网上四处搜索,在EclEmma网站上找到了以下内容: 我的代码使用反射。为什么用JaCoCo执行时会失败? 为了收集执行数据,JaCoCo对测试中的类进行了测试 它向类中添加了两个成员:一个私有静态字段 $jaco

当尝试运行Coverage as或使用emma:emma运行maven构建时,我得到以下信息:

java.lang.IllegalStateException:无法访问方法:无法设置 静态最终[Z]字段packageName.ClassName.$jacocdata到[Z]

因此,我在网上四处搜索,在EclEmma网站上找到了以下内容:

我的代码使用反射。为什么用JaCoCo执行时会失败?

为了收集执行数据,JaCoCo对测试中的类进行了测试 它向类中添加了两个成员:一个私有静态字段 $jacocoData和私有静态方法$jacocoInit()。两个成员 标记为合成的

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

但是我在网上找不到任何关于如何真正忽略Emma合成成员的文档

在STS中,我在Preferences/Java/CodeCoverage下看到一个用于放置排除项的排除框(我知道我也可以将排除项放在POM中)

我只是想知道需要做些什么才能排除所有的合成类


感谢

我最近在使用一个通用的CSV导出帮助程序时遇到了这个问题。您看到的例外是Jacoco/Emma无法设置用于跟踪代码覆盖率的合成字段。您需要允许Emma访问该合成字段

如果您已停止Emma访问合成字段,因为添加合成字段会导致反射出现问题,例如,您正在使用反射对
字段
对象的集合进行迭代,只需执行以下操作:

Field[] fields = fooObject.getClass().getDeclaredFields();
Field[] nonSyntheticFields = new Field[fields.length];

for(int i = 0; i < fields.length; i++){         
    if(!fields[i].isSynthetic()){
        nonSyntheticFields[i] = fields[i];
        //Or whatever processing you are doing here with your fields.
    }
}
Field[]fields=foooObject.getClass().getDeclaredFields();
字段[]非合成字段=新字段[fields.length];
对于(inti=0;i

上面的内容允许您将应用程序不应该真正了解的合成字段与您在类中声明的字段分开。我知道这看起来有点粗糙,但这是我能想到的最优雅的解决方案。Emma需要该字段来插入您的代码,这是您能做的最好的事情请确保您的代码不会弄乱合成变量。

我认为忽略合成成员的最佳方法如下

for (Field field : fields) {
    if (!field.isSynthetic()) {
        // enter code here
    }
}

忽略
$jacocdata
的“黑客”方法是知道它总是附加在类成员列表的末尾。不过,我非常想知道如何排除Java/Scala类的任何合成成员。运气好吗?我遇到了同样的问题,现在我正在搜索如何将代码更改为igno再合成成员。