Junit 4测试Kotlin中的内部类

w80xi6nr  于 2022-11-11  发布在  Kotlin
关注(0)|答案(2)|浏览(160)

我用Junit4和Kotlin。
我使用Enclosed进行内部类测试。

import org.junit.Test
import org.junit.experimental.runners.Enclosed
import org.junit.runner.RunWith

@RunWith(Enclosed::class)
class SampleTest {

    var text = "parent class"

    class Class1 {
        @Test
        fun `print the text`() {
            println(text)
        }
    }

    inner class Class2 {
        @Test
        fun `print the text`() {
            println(text)
        }
    }

}

在Class1和Class2中,需要变量text
我使用inner来访问子类到父类。
但我有一个问题,测试功能被删除,我不能测试。见照片。

我可以用Junit4测试Kotlin中的内部类吗?

ih99xse1

ih99xse11#

Class1SampleTest中的一个普通嵌套类,它只是一个组织上的东西,你的Class1示例没有任何对SampleTest示例的引用,所以它不能访问text(除非显式地传递了一个示例)。
如果你想让一个嵌套类能够像这样访问一个封闭的示例,你需要把它标记为inner,就像Class2一样。

val sample = SampleClass()
val class2 = sample.Class2()
sample.text = "wow!"
class2.`print the text`()

如果不熟悉,您可以在the docs中阅读这些内容
因此,如果JUnit构造了一个Class1示例,它不知道text是什么,因为它是其他一些不相关类中的示例变量。
我假设它不知道如何创建Class2,因为它需要一个SampleTest示例来创建Class2。所有Enclosed的示例都使用静态嵌套类,就像the Java docs say
静态嵌套类与其外部类(和其他类)的示例成员进行交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了打包方便而嵌套在另一个顶级类中。
所以这基本上和Kotlin的(非内部)嵌套类是一样的,比如你的Class1
如果您要在类中组织测试,您可能希望将text粘贴到companion object中(或者只是SampleClass之外的顶级object,或者如果您确实希望的话,只是在文件的顶级中--只是在任何其他类都可以以“静态”方式访问它的地方

busg9geu

busg9geu2#

我们可以使用3种方式
1.使用嵌套运行器this
1.使用分层上下文运行器this
1.使用Enclosed和伴随对象,而不使用内部类
@运行方式(带括号::class)
测试类{

companion object {
     var text = "parent class"
 }

 class Class1 {
     @Test
     fun `print the text`() {
         println(text)
     }
 }

 class Class2 {
     @Test
     fun `print the text`() {
         println(text)
     }
 }

}

相关问题