Jacoco覆盖率和Kotlin默认参数

我有以下的构造函数:

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 

指示Kotlin编译器为该函数生成重载,以替代默认参数值。

如果一个方法有N个参数,其中M有默认值,则会产生M个过载:第一个参数取N-1个参数(除最后一个取默认值外),第二个参数取N-2个参数。上。

当在Kotlin中调用任意数量的参数的构造函数时,将会调用默认的3参数构造函数 – 默认值用于省略的参数。
因此,Jacoco并没有将过载标记为覆盖,这是有道理的:他们不是。

就像@voddan说的那样,这些重载是生成的,保证正确。 对这些单独进行测试没有多大意义。

如果您确实想要全面覆盖,请删除@JvmOverloads注释。 这应该防止产生额外的重载。

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

你确定你需要100%覆盖这些构造函数吗? 这些构造函数是由编译器自动生成的,这保证了它们的正确性(比代码覆盖范围更大)。

海事组织是足够的测试与所有自定义参数的构造函数。 所有默认参数的额外测试可能包括计算默认值。

总的来说,测试自动生成的代码可能不是最好的主意。