我用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中的内部类吗?
2条答案
按热度按时间ih99xse11#
Class1
是SampleTest
中的一个普通嵌套类,它只是一个组织上的东西,你的Class1
示例没有任何对SampleTest
示例的引用,所以它不能访问text
(除非显式地传递了一个示例)。如果你想让一个嵌套类能够像这样访问一个封闭的示例,你需要把它标记为
inner
,就像Class2
一样。如果不熟悉,您可以在the docs中阅读这些内容
因此,如果JUnit构造了一个
Class1
示例,它不知道text
是什么,因为它是其他一些不相关类中的示例变量。我假设它不知道如何创建
Class2
,因为它需要一个SampleTest
示例来创建Class2
。所有Enclosed
的示例都使用静态嵌套类,就像the Java docs say:静态嵌套类与其外部类(和其他类)的示例成员进行交互,就像任何其他顶级类一样。实际上,静态嵌套类在行为上是一个顶级类,为了打包方便而嵌套在另一个顶级类中。
所以这基本上和Kotlin的(非内部)嵌套类是一样的,比如你的
Class1
。如果您要在类中组织测试,您可能希望将
text
粘贴到companion object
中(或者只是SampleClass
之外的顶级object
,或者如果您确实希望的话,只是在文件的顶级中--只是在任何其他类都可以以“静态”方式访问它的地方busg9geu2#
我们可以使用3种方式
1.使用嵌套运行器this
1.使用分层上下文运行器this
1.使用Enclosed和伴随对象,而不使用内部类
@运行方式(带括号::class)
测试类{
}