5

我主要是一名 Java 开发人员,在 kotlin 中编写单元测试时对结构感到好奇,

假设在 kotlin 中没有包私有

private限制对文件的可见性

internal限制对模块的可见性

我怎样才能只开课来测试课?

我必须在 kotlin 类中编写测试还是对所有模块(内部)开放类?

只为单元测试打开方法的 kotlin 方法是什么?

编辑

在@bentolor 的kotlin 讨论中发现了类似的问题/请求:

我应该如何正确进行单元/白盒测试?我想编写测试代码来测试类内部功能,我不想将其暴露给除我的测试类之外的其他类。

包保护的可见性是实现这一目标的绝佳方式。而 Kotlin 现在要求我将这些方法有效地公开,并在整个项目中散布组件的可见 API,以便能够测试它们。

在我看来,内部或多或少是公开的,因为它的范围要大得多。大多数项目都有。大约 1 - 5 个 Kotlin 意义上的“模块”。

在这里非常强烈地要求/倡导本地包的可见性。

4

2 回答 2

3

正式地,不可能在 JVM 上诚实地做到这一点,因为无法为可能的 interiters 的子集打开类。

但是,它可以通过以下技巧部分完成:

open class SomeClass internal constructor(val configurableParameter: Int) {
    companion object {
        private const val defaultInput = 123

        fun create() = SomeClass(defaultInput)
    }
}

此类的构造函数只能从同一个模块(或测试)中调用。而且类是公开的,所以任何人都可以使用它。但是,从外部模块中,您只有两种类构造方式:伴生对象或反射。

最后,您不能在任何其他模块中从此类继承,因为构造函数是内部的。

于 2019-12-03T16:05:29.613 回答
2

仅适用于 Android 开发人员,有 AndroidX VisibleForTesting 注解

表示类、方法或字段的可见性已放松,因此它比使代码可测试所必需的更广泛可见

于 2021-09-22T08:02:08.573 回答