排除STS内Emma中的合成类

bhc*_*ney 10 java code-coverage emma eclemma spring-tool-suite

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

java.lang.IllegalStateException:无法访问方法:无法将static final [Z field packageName.ClassName.$ jacocoData设置为[Z]

所以我在网上搜索了一下,我在EclEmma网站上找到了以下内容:

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

为了收集执行数据,JaCoCo检测被测试的类,它们为类添加了两个成员:私有静态字段$ jacocoData和私有静态方法$ jacocoInit().两个成员都标记为合成.

请更改您的代码以忽略合成成员.无论如何,这也是一种很好的做法,因为Java编译器在某些情况下也会创建合成成员.

但我在网上找不到关于如何用Emma实际忽略合成成员的任何文档.

在STS中我查看了Preferences/Java/Code Coverage,我看到一个Excludes框来放置排除项(我知道我也可以将排除项放在我的POM中).

我只是想知道需要在那里排除所有合成类.

谢谢

Jam*_*ENL 11

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

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

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

上面允许您从您在类中声明的字段中分离出您的应用程序不应该真正了解的合成字段.我知道它看起来有点笨拙,但它是我能想到的最优雅的解决方案.Emma需要该字段能够检测您的代码,您可以做的最好的事情是确保您的代码不会混淆该合成变量.