繁体   English   中英

Junit 4 在 kotlin 中测试内部类

[英]Junit 4 test inner class in kotlin

我使用 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 测试高岭土的内部类吗?

Class1是一个普通的嵌套类,恰好在SampleTest 这只是一个组织方面的事情,您的Class1实例没有对SampleTest实例的任何引用,因此它无法访问text (除非明确传递实例)。

如果您希望嵌套类能够访问这样的封闭实例,则需要将其标记为inner ,就像Class2 这样您就可以通过SampleClass的实例创建Class2的实例,例如

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

如果不熟悉,您可以在文档中阅读有关这些内容的信息

所以是的,如果 JUnit 构造一个Class1实例,它不知道text是什么,因为它是其他一些不相关类中的实例变量。

我假设它不知道如何创建Class2 ,因为它需要一个SampleTest实例来做到这一点。 Enclosed所有示例都使用静态嵌套类,就像Java 文档所说

静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样。 实际上,静态嵌套类在行为上是一个顶层类,为了方便打包,它嵌套在另一个顶层类中。

所以这与 Kotlin 的(非内部)嵌套类基本​​相同,比如你的Class1 您可能无法使用inner类(无论如何都不能组织和自动运行测试)

如果您在类中组织测试(或者只是SampleClass之外的顶级object ,或者如果您真的需要,则仅在文件的顶级中 - 就在某个地方),您可能希望将text粘贴在companion object中任何其他类以“静态”方式访问

我们可以使用 3 种方式

  1. 使用 NestedRunner这个

  2. 使用 HierarchicalContextRunner 这个

  3. 使用 Enclosed 和伴生对象,不要使用内部类

    @RunWith(封闭::类)

    类测试{

     companion object { var text = "parent class" } class Class1 { @Test fun `print the text`() { println(text) } } class Class2 { @Test fun `print the text`() { println(text) } }

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM