【问题标题】:Excluding Synthetic Classes in Emma within STS在 STS 中排除 Emma 中的综合类
【发布时间】:2013-07-13 13:14:44
【问题描述】:

当尝试使用 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 中)。

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

谢谢

【问题讨论】:

  • 忽略$jacocoData 的“hacky”方法是知道它总是附加在班级成员列表的末尾。不过,我很想知道如何排除 Java/Scala 类的任何合成成员。
  • 运气好吗?我遇到了同样的问题,现在我正在寻找如何更改代码以忽略合成成员

标签: java code-coverage emma spring-tool-suite eclemma


【解决方案1】:

我最近在使用我使用的通用 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 需要该字段来检测您的代码,您能做的最好的事情就是确保您的代码不会与该合成变量混淆。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-19
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      相关资源
      最近更新 更多