当前位置: 首页 > 知识库问答 >
问题:

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

唐博文
2023-03-14

我正在尝试对<code>java进行单元测试。lang类。

背景:到目前为止有效的方法

这不是真正的标准,但是将 ${sourceDirectory} 中 OpenJDK-8-sources(在 Ubuntu 上)中提供的源代码和 rt.jar 中提供的类复制到 ${project.build.outputDirectory} 中非常简单,然后 JaCoCo maven 插件可以看到它们并为某些类生成合适的输出。

例如,我得到了一些关于sun.reflect.ByteVectorFactory来源的报道。

但是我无法覆盖< code>java.lang中的类。调用< code>Byte.toString()时,报告中不包含该函数,并且< code>Byte.class不会显示在< code>classDumpDir生成的数据中。

我查看了JaCoCo的源代码,看看< code>java.lang是否被显式忽略,到目前为止我没有发现任何明显的问题,但是我对JaCoCo源代码一点也不熟悉。

实际问题

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

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

编辑

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

邮件列表线程:https://groups.html" target="_blank">google.com/g/jacoco/c/_tuoA7DHA7E/m/BQj53OvXoUsJ

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

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

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

因此,它可以解释为什么某些类没有被检测。

共有1个答案

奚翰海
2023-03-14

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

    < li>java.lang.Byte不在覆盖范围内 < li>java.lang.ProcessBuilder获得覆盖率 < li>java.util.ArrayList不包含在内 < li>java.util.Calendar获得覆盖范围

因此,似乎在代理加载时已经加载的类不能以这种方式进行插装。

我提取了<code>rt中的所有类。jar</code>并用离线检测对它们进行检测,然后替换<code>rt。jar</code>及其插入工具的版本,并将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 源代码进行一些修改,因此目前无法检测这些类。

 类似资料:
  • 我正试图在詹金斯的sonarqube仪表板上获取代码覆盖率报告。代码覆盖率报告即将发布,但仅显示4.6%的覆盖率。经过调查,我发现使用PowerMock编写的测试类被跳过了。 经过进一步调查,我发现“JaCoCo不能很好地处理动态修改/创建的类(这就是powermock的工作方式)。这是一个已知的限制,我们目前对此无能为力”。 是否有任何解决办法,以便我也可以为使用PowerMock编写的测试类获

  • 我有这样一个简单的课程: 我想为它写一个测试,下面是一个框架: ErrorLogger类中的logger是由StaticLoggerBinder提供的,所以我的问题是-如何让它工作,以便那些检查“1*logger.error(u作为字符串)”可以工作?在ErrorLogger类中,我找不到一种恰当的方式来嘲笑那个记录器。我曾考虑过反射,并以某种方式访问它,此外,mockito注入也有一个想法(但如

  • 目前正在搜索教程、解释和示例。我试过不同的例子,遇到了不同的错误。我当前的错误是: |错误编译错误编译[单元]测试:启动失败: 在我的测试报告中。它输出: 单元测试结果-摘要未执行测试。 我的“用户pec.groovy”代码是这样的: 有人能帮忙吗。我是圣杯新手。谢谢 除上述问题外,当我在课堂上省略了如下所示的禁忌: 我发现了这个错误: |运行1单元测试...1 of 1|失败:初始化错误(org

  • 问题内容: 我有几个DAO对象,这些对象用于从数据库中检索信息,我 确实 想为它们编写一些自动化测试,但是我很难弄清楚该怎么做。 我正在使用Spring 来运行实际查询(通过准备好的语句)并将结果映射到模型对象(通过类)。 如果要编写单元测试,则不确定如何/应该模拟对象。例如,由于只有读操作,因此我将使用实际的数据库连接,而不模拟jdbcTemplate,但我不确定那是正确的。 这是批处理中最简单

  • 我有DaoImpl类: 我的测试是: 测试是成功的,但是当我运行具有覆盖率的junit测试时,它显示方法没有被覆盖,因此我的整体单元测试行覆盖率低于要求。我们能涵盖那部分吗?如果是,我们怎么做?谢了。

  • 问题内容: 如何在单元测试中测试 hashCode()函数? 问题答案: 每当我覆盖equals和hash代码时,我都会按照Joshua Bloch在“ Effective Java”第3章中的建议编写单元测试。我确保equals和hash代码是自反的,对称的和可传递的。我还确保“不等于”对所有数据成员均正常工作。 当我检查对equals的调用时,我还要确保hashCode的行为符合预期。像这样: