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

标签 java code-coverage kotlin jacoco

我有以下构造函数:

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/

相关文章:

java - 单元格大小独立于行 MigLayout

vhdl - 为什么这个并发语句的代码覆盖率低于 100%?

code-coverage - Allure 和代码覆盖率报告

java - Heroku/Kotlin : java. lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics

android - 在个人资料图片上设置个人资料编辑图标

java - 可以在 Java 或 Kotlin 中以编程方式获取局部变量名吗?

java - 你会使用 AOP 来跟踪积分吗?

java - 将类型化数组从 Android 移植到 iPhone 应用程序

java - 如何优雅地处理 Kafka 中断?

c++ - 分析 "invalid arc tag"(0x00000000)