我有以下构造函数:
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看到的唯一的东西
答案 0 :(得分:4)
由于您正在使用@JvmOverloads
注释,编译器将生成3个重载的构造函数。该注释主要用于在普通Java中省略参数。
@Target([AnnotationTarget.FUNCTION, AnnotationTarget.CONSTRUCTOR]) annotation class JvmOverloads
指示Kotlin编译器 为此函数生成替换默认值的重载 参数值。
如果方法具有N个参数且M具有默认值,则M 生成重载:第一个采用N-1个参数(除了 最后一个采用默认值),第二个采用N-2 参数,等等。
在Kotlin中使用任意数量的参数调用构造函数时,将调用默认的3参数构造函数 - 其中default values用于省略的参数。
因此,有意义的是Jacoco没有将重载标记为覆盖:它们不是。
就像@voddan所说,这些重载是生成的,并保证正确。测试这些单独的内容没有多大意义。
如果您确实需要全面覆盖,请删除@JvmOverloads
注释。这样可以防止产生额外的重载。
如果你不能删除注释,因为你将从Java调用重载的构造函数,那么拥有一个涵盖这些注释的Java测试套件毕竟是有道理的:它是你想要覆盖的真实场景。
答案 1 :(得分:3)
您确定需要对这些构造函数进行100%的覆盖吗?这些构造函数由编译器自动生成,这保证了它们的正确性(比代码覆盖范围更大)。
IMO足以使用所有自定义参数测试构造函数。对所有默认参数的附加测试可能包括默认值的计算。
总的来说,测试自动生成的代码可能不是最好的主意。