使用 JaCoCo 对 java.lang 类进行单元测试

时间:2021-04-25 10:35:59

标签: java jacoco jacoco-maven-plugin

我正在尝试使用 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 源代码一点也不熟悉。

实际问题

可以做些什么来解决这个限制?我正在考虑以下可能性:

  • 这是 Java 的一个硬性限制,对此无能为力
  • 排除 java.lang 在 JaCoCo 中是硬编码的,因为它是系统包名称,但这可以更改
    • 通过设置一些隐藏选项或环境变量
    • 通过提供它们的修改版本来覆盖类路径中的某些文件
    • 通过更改 JaCoCo 源代码

编辑

我似乎并不是一个人尝试做这种事情。

邮件列表线程: https://groups.google.com/g/jacoco/c/_tuoA7DHA7E/m/BQj53OvXoUsJ

在 GitHub 上拉取请求: https://github.com/jacoco/jacoco/pull/49

在这中间的某个地方,有人提到了

<块引用>

特别是代理使用的 JDK 类 本身可能无法跟踪。

所以它可以解释为什么有些类没有被检测。

1 个答案:

答案 0 :(得分:0)

我做了更多的测试,我看到了

  • 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 源代码进行一些修改,因此目前无法检测这些类。

相关问题