【发布时间】: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 的更多信息,发现它具有您描述的确切问题。我会把它作为这个问题的答案发布。