Skip to main content
 首页 » 编程设计

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

2024年02月06日13mayingbao

我有以下构造函数:

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 - 有没有办法做到这一点?

更新:我在测试中使用像 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 测试套件毕竟是有意义的:这是您想要涵盖的真实世界场景。