gpt4 book ai didi

java - Jacoco 覆盖率和 Kotlin 默认参数

转载 作者:行者123 更新时间:2023-12-03 02:28:50 25 4
gpt4 key购买 nike

我有以下构造函数:

open class IPFS @JvmOverloads constructor(protected val base_url: String = "http://127.0.0.1:5001/api/v0/",
protected val okHttpClient: OkHttpClient = OkHttpClient.Builder().build(),
protected val moshi: Moshi = Moshi.Builder().build()) {

现在,在测量覆盖范围时,我总是会错过使用默认值的情况。我能想象的唯一出路是在 java 中编写一些使用其他构造函数的测试 - 但我想留在纯 kotlin - 有没有办法做到这一点?

enter image description here

更新:我在测试中使用像 IPFS() 这样的构造函数 - 但我认为在生成的 java 字节码上,它会转换为具有所有 3 个参数的构造函数 - 这是 jacoco 看到的唯一东西

最佳答案

由于您正在使用 @JvmOverloads注解时,编译器会生成3个重载构造函数。该注解主要用于能够在普通Java中省略参数。

@Target([AnnotationTarget.FUNCTION, AnnotationTarget.CONSTRUCTOR])
annotation class JvmOverloads

Instructs the Kotlin compiler to generate overloads for this function that substitute default parameter values.

If a method has N parameters and M of which have default values, M overloads are generated: the first one takes N-1 parameters (all but the last one that takes a default value), the second takes N-2 parameters, and so on.

在 Kotlin 中调用具有任意数量参数的构造函数时,将调用默认的 3 参数构造函数 - 其中 default values用于省略的参数。
因此,Jacoco 没有将重载标记为已覆盖是有道理的:它们没有。

就像@voddan所说,这些重载是生成的,并且保证是正确的。单独测试这些没有多大意义。

如果您确实想要完全覆盖,请删除 @JvmOverloads 注释。这应该可以防止生成额外的过载。

如果您无法删除注释,因为您将从 Java 调用重载的构造函数,那么拥有一个涵盖这些内容的 Java 测试套件毕竟是有意义的:这是您想要涵盖的真实世界场景。

关于java - Jacoco 覆盖率和 Kotlin 默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37763969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com