【问题标题】:JaCoCo 0% coverage for objects created with Jackson.map.ObjectMapperJaCoCo 对使用 Jackson.map.ObjectMapper 创建的对象的覆盖率为 0%
【发布时间】:2015-07-24 17:13:34
【问题描述】:

我有一个应用了 JaCoCo 插件的 Gradle 项目。当我运行我的测试并创建一个 jacocoTestReport 我得到这个类不匹配错误

[ant:jacocoReport] Classes in bundle 'e-services' 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 eservices/model/persistence/Event does not match.

这些类应该匹配,因为我正在本地进行清理 -> 构建 -> 测试。我怀疑这种不匹配来自于我使用 jackson.map.ObjectMapper 从 JSON 创建一个对象,这会导致存储在 jacoco 的 .exec 文件中的 classId 与编译的类 id 不匹配.

我的测试广泛使用 Event 类,但由于类不匹配,我仍然得到 0% 的覆盖率:

import eservices.model.persistence.Event;
event = mapper.readValue(json, Event.class);
event.setTenId(TenIds.getInternalId());

有没有办法从这个场景中获得覆盖?

【问题讨论】:

  • 问题stackoverflow.com/q/20219936/783510与您的问题有关吗?
  • 不,我确实有一个 jacoco 代理正在运行并捕获数据。我也有生成的 .exec 文件和编译的类,问题是 jacoco 说 Event.class 的捕获数据与编译的类 Event.class 不匹配,尽管它运行的是完全相同的编译类。
  • @user3470347 您是否使用会动态修改 Event 类的字节码的模拟库(例如 PowerMock)?如果是,这是一个已知的不兼容性:JaCoCo 依赖运行时字节码的校验和来匹配它用于生成报告的字节码的校验和。尝试 JaCoCo javaagent 的 classdumpdir 选项以确保类字节相同,并且(可选)仅使用这些字节码生成报告。
  • 我正在使用 JPA (EclipseLink),特别是 group: 'org.eclipse.persistence', name: 'javax.persistence', version: '2.0.5')
  • @bkail 感谢您的建议,我挖掘了有关 JPA 和 JaCoCo 的更多信息,发现它具有您描述的确切问题。我会把它作为这个问题的答案发布。

标签: java jackson jacoco


【解决方案1】:

这是 JaCoCo 已知的限制,因为 JaCoCo 依赖运行时字节码的校验和来匹配它用于生成报告的字节码的校验和。通常,当您有两个检测字节码的库时会发生这种情况,例如 PowerMock 和 JaCoCo,或 JPA 和 JaCoCo。

这在以下 JaCoCo 问题 Coverage is missing a class that was in fact tested #193 中被引用,并被标记为“wontfix”“已知限制”

【讨论】:

    猜你喜欢
    • 2017-05-31
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 2016-02-12
    • 2020-07-18
    • 2012-09-07
    • 2020-06-01
    相关资源
    最近更新 更多