【发布时间】:2021-07-18 23:39:52
【问题描述】:
我正在尝试使用 JaCoCo 对 java.lang 类进行单元测试覆盖率。
背景:目前有效
这不是真正的标准,但是很简单地将OpenJDK-8-sources(在Ubuntu上)中提供的源代码复制到${sourceDirectory}中,并将rt.jar中提供的类复制到 ${project.build.outputDirectory}中,然后JaCoCo maven 插件可以看到它们并为某些类生成合适的输出。
例如,我得到了一些关于sun.reflect.ByteVectorFactory 来源的报道。
但我无法覆盖java.lang 中的课程。调用Byte.toString()时,报告中不包含该函数,Byte.class不会出现在classDumpDir生成的数据中。
我查看了 JaCoCo 的源代码,看看 java.lang 是否被明确忽略,到目前为止我没有发现任何明显的东西,但我对 JaCoCo 源代码一点也不熟悉。
实际问题
可以做些什么来解决这个限制?我正在考虑以下可能性:
- 这是 Java 的硬性限制,对此无能为力
-
java.lang的排除在 JaCoCo 中是硬编码的,因为它是系统包名称,但可以更改- 通过设置一些隐藏选项或环境变量
- 通过提供修改版本来覆盖类路径中的某些文件
- 通过更改 JaCoCo 源代码
编辑
我似乎并不是唯一一个尝试做这种事情的人。
邮件列表线程: https://groups.google.com/g/jacoco/c/_tuoA7DHA7E/m/BQj53OvXoUsJ
GitHub 上的拉取请求: https://github.com/jacoco/jacoco/pull/49
在这中间的某个地方,有人提到了这一点
尤其是代理使用的 JDK 类 本身可能无法追踪。
所以它可以解释为什么有些类没有被检测。
【问题讨论】:
-
尝试使用 inclbootstrapclasses 和 inclnolocationclasses (jacoco.org/jacoco/trunk/doc/agent.html)
-
是的,我已经设置了这些选项。
-
另外,一些方法实现可以在运行时被JVM替换为本地代码。这些被称为intrinsics。
标签: java jacoco jacoco-maven-plugin