Jacoco覆盖范围与匿名类不一致

时间:2017-01-24 01:40:00

标签: gradle code-coverage jacoco

我们使用jacoco,但是在不同的构建和不同的机器上,但是相同的代码和gradle脚本,它给出了不同的结果。问题似乎是匿名类 - 它们有时不会与测试运行相结合 - 尽管它们都是作为同一个,干净的构建的一部分完成的。我们得到了这个:

[ant:jacocoReport] Classes in bundle 'SomeThing' do no match with execution data. For report generation the same class files must be used as at runtime.
[ant:jacocoReport] Execution data for class a/b/c/$Mappings$1 does not match.
[ant:jacocoReport] Execution data for class a/b/c/$Mappings$3 does not match.

因此看起来它让匿名类不同步。知道如何解决这个问题吗?这真的是我们的规则,因为我们有100%的类覆盖要求 - 这意味着有些类显示有时未被覆盖。

1 个答案:

答案 0 :(得分:0)

基于文件jacoco.exec生成报告JaCoCo执行字节码分析,即编译类。

不同版本的Java编译器生成不同的字节码。即使重新编译也可能产生不同的字节码 - 请参阅https://bugs.openjdk.java.net/browse/JDK-8067422https://github.com/jacoco/jacoco/issues/383

如果在运行时使用的类(在创建jacoco.exec期间)不同(例如,在具有不同编译器的另一台机器上创建),则它们不能与创建报告期间使用的类相关联,从而导致消息{ {1}}。您可以在JaCoCo documentation中阅读有关课程ID的更多信息。

总而言之,要避免此消息 - 在创建Execution data for class ... does not match期间以及生成报告期间使用完全相同的类文件。