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

Jacoco抱怨分支机构不太可能缺少覆盖范围

汪甫
2023-03-14

我使用Gradle 6.3和Jacoco来编译、测试和显示覆盖率报告。但是我不明白为什么它抱怨“两个分支中的一个丢失了”,根本没有分支:

下面是完整的静态编程语言数据类:

data class ListNode<T>(var value: T, var next: ListNode<T>?) {

    override fun hashCode(): Int = value.hashCode()

}

如果幕后有树枝,它们是什么?我该如何覆盖它们?

共有2个答案

张嘉熙
2023-03-14

Kotlin中的数据类有默认的自动生成方法(等于toString哈希代码,getter,setter)。在本例中,我们讨论的是等于。它在类ListNode的代码中不可见,但它的JVM字节码肯定包含equalstoString等。

Jacoco主要针对Java代码覆盖,因此这种情况可能被视为Jacoco在Kotlin中对生成方法的错误处理。如果您愿意,请向项目维护人员提交一个问题。

无论如何,为了避免Jacoco针对这种特殊情况发出警告,只需查看报告中的代码(第17、18行,…直到equals方法的末尾):

>

  • 临时复制生成的equals方法的内容到ListNode(只是为了自己方便)

    将代码覆盖率提高到所需的水平

    删除equals方法

    代码覆盖率保持在步骤(2)中的状态,因为equals保持不变(但现在它是隐式创建的)

  • 齐意致
    2023-03-14

    字节码实际上有两个分支,原因如下。

    您正在Any上使用扩展名hashCode() T的上限是有吗 ,而不是任何。此扩展的实现方式如下:

    public inline fun Any?.hashCode(): Int = this?.hashCode() ?: 0
    

    这意味着在字节码中,您对值的调用。hashCode()替换为value?。hashCode()?:0

    在您的测试中,您只涉及可能不为空的情况,因此分支?:不包括0

    在JaCoCo不支持inline函数之前,这里有两种解决方案:

    • 还包括使用nullT测试ListNode的另一个分支
    data class ListNode<T: Any>(var value: T, var next: ListNode<T>?)
    

     类似资料:
    • 问题内容: 在Swift 1.2的最新升级之后,我不知道如何将一行文本拆分为单词。我曾经这样做: 但这不再起作用,因为… 嗯,好吧,即使我可以上次建造?好吧,让我们尝试… 好吧,我能想到的所有其他版本都说: 让我们来听听它对新编程语言进行Beta测试!好极了! 有人知道1.2的正确秘密调味料吗? 问题答案: 在Swift 1.2中,似乎参数的顺序已更改: 或者,使用默认值: 谓词现在是最后一个参数

    • 在这些行中,我想知道是否有一个was让jacoco打印出哪些行在构建过程中没有被单元测试覆盖? 目前,jacoco导致生成失败,报告每个不符合标准的文件的覆盖率,但它没有提供关于未覆盖的特定行的任何信息。

    • 问题内容: 我正在尝试连接到远程主机,并检查文件是否存在。在此阶段,我仅尝试连接,但是出现错误: 我试图找出其他人是否有像我一样的问题,但我却找不到。 我知道我需要在此过程中以某种方式检查knowns_hosts,但我只是想不通如何… 问题答案: 您在这里寻找的是: 然后将您的hostKey定义行替换为 有关此主题的更多信息: 我从中获取部分代码的官方样本 为什么现在需要hostKey 编辑:还请

    • 这是魔法应该发生的地方 我正在使用mvn构建我的项目与这个目标清洁包-FAE与这个配置文件jacoco arq-wildfly 构建失败,jacoco.exec文件在我的目标目录中创建。 null

    • 我有一些使用try-with-resources的代码,在jacoco中,它只覆盖了一半。所有的源代码行都是绿色的,但我得到一个黄色的小符号,告诉我8个分支中只有4个被覆盖。 我无法弄清楚所有分支是什么,以及如何编写涵盖它们的代码。三个可能的地方抛出。这些是、和隐含的 不抛出任何异常, 我想不出任何其他案例,但我仍然只有8个案例中的4个。 有人能给我解释一下为什么它是8个中的4个,还有没有其他方法

    • 问题内容: 在以下方法中,即使通过该方法只有一条路径,并且编译器包含一条语句,编译器也会抱怨 缺少return语句。抑制该错误需要另一条语句。 鉴于Java编译器可以识别无限循环,为什么它也不能处理这种情况?链接的问题提示,但不提供此特定情况的详细信息。 问题答案: JLS14.21,“无法到达的语句”是处理此问题的部分: if语句(是否具有else部分)以异常方式处理。因此,本节末尾将单独讨论。