当尝试使用emma:emma运行Coverage或运行maven构建时,我得到以下内容:
java.lang.IllegalStateException:无法访问方法:无法设置 static final [Z field packageName.ClassName。$ jacocoData to [Z
所以我在网上搜索,我在EclEmma网站上找到了以下内容:
我的代码使用反射。当我用JaCoCo执行它时为什么会失败?
为了收集执行数据,JaCoCo负责测试被测试的类 这会在类中添加两个成员:私有静态字段 $ jacocoData和私有静态方法$ jacocoInit()。两位成员 被标记为合成。
请更改您的代码以忽略合成成员。这很好 尽管如此,Java编译器也会创建合成成员 在某种情况下。
但我在网上找不到关于如何用Emma实际忽略合成成员的任何文档。
在STS中我查看了Preferences / Java / Code Coverage,我看到一个Excludes框来放置排除项(我知道我也可以将排除项放在我的POM中)。
我只是想知道需要在那里排除所有合成类。
由于
答案 0 :(得分: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.
}
}
上面的内容允许您从您在类中声明的字段中分离出您的应用程序不应该真正了解的合成字段。我知道它看起来有点笨拙,但它是我能想到的最优雅的解决方案。 Emma需要该字段能够检测代码,您可以做的最好的事情是确保您的代码不会混淆该合成变量。
答案 1 :(得分:-1)
我认为忽略合成成员的最佳方法如下:
for (Field field : fields) {
if (!field.isSynthetic()) {
// enter code here
}
}