问题描述
我正在尝试使用 JaCoCo 对 java.lang
类的覆盖率进行单元测试。
上下文:目前有效
这并不是真正的标准,但是将 OpenJDK-8-sources
(在 Ubuntu 上)中提供的源代码复制到 ${sourceDirectory}
中以及将 rt.jar 中提供的类复制到{{1 }},然后 JaCoCo maven 插件可以看到它们并为某些类生成合适的输出。
例如,我对 ${project.build.outputDirectory}
的来源进行了一些报道。
但我无法覆盖 sun.reflect.ByteVectorFactory
中的类。调用 java.lang
时,该函数未包含在报告中,Byte.toString()
未显示在 Byte.class
生成的数据中。
我查看了 JaCoCo 的源代码,看看 classDumpDir
是否被明确忽略,到目前为止我没有发现任何明显的东西,但我对 JaCoCo 源代码一点也不熟悉。
实际问题
可以做些什么来解决这个限制?我正在考虑以下可能性:
编辑
我似乎并不是一个人尝试做这种事情。
邮件列表线程: https://groups.google.com/g/jacoco/c/_tuoA7DHA7E/m/BQj53OvXoUsJ
在 GitHub 上拉取请求: https://github.com/jacoco/jacoco/pull/49
特别是代理使用的 JDK 类 本身可能无法跟踪。
所以它可以解释为什么有些类没有被检测。
解决方法
我做了更多的测试,我看到了
- java.lang.Byte 未覆盖
- java.lang.ProcessBuilder 获得覆盖
- java.util.ArrayList 未覆盖
- java.util.Calendar 获得覆盖
因此,代理加载时已经加载的类似乎无法通过这种方式进行检测。
我提取了 rt.jar
中的所有类,并使用离线检测对它们进行检测,然后将 rt.jar
替换为它们的检测版本,并将 JaCoCo 代理包含在引导类路径中(使用 -Xbootclasspath)。>
这样做,我得到以下无限递归:
...
at java.lang.System.getProperties(System.java)
at org.jacoco.agent.rt.internal_f3994fa.Offline.getRuntimeData(Offline.java:36)
at org.jacoco.agent.rt.internal_f3994fa.Offline.getProbes(Offline.java:60)
at java.lang.System.$jacocoInit(System.java)
at java.lang.System.getProperties(System.java)
at org.jacoco.agent.rt.internal_f3994fa.Offline.getRuntimeData(Offline.java:36)
应该可以捕获递归以防止这种情况发生,但这显然需要对 JaCoCo 源代码进行一些修改,因此目前无法检测这些类。