Java JaCoCo 0%覆盖率用于使用Jackson.map.ObjectMapper创建的对象

Java JaCoCo 0%覆盖率用于使用Jackson.map.ObjectMapper创建的对象,java,jackson,jacoco,Java,Jackson,Jacoco,我有一个Gradle项目,应用了JaCoCo插件。当我运行测试并创建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 dat

我有一个Gradle项目,应用了JaCoCo插件。当我运行测试并创建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不匹配

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

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

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

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


以下JaCoCo问题中引用了该问题,并将其标记为“wontfix”“已知限制”

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