【问题标题】:Junit 4 test inner class in kotlinJunit 4 在 kotlin 中测试内部类
【发布时间】:2020-11-02 16:44:11
【问题描述】:

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

【问题讨论】:

    标签: android unit-testing kotlin testing junit


    【解决方案1】:

    Class1 是一个简单的嵌套类,恰好位于SampleTest 中。这只是一个组织的事情,您的 Class1 实例没有对 SampleTest 实例的任何引用,因此它无法访问 text (除非没有显式传递实例)。

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

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

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

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

    我假设它不知道如何创建Class2,因为它需要一个SampleTest 实例来执行此操作。 Enclosed 的所有示例都使用静态嵌套类,例如 the Java docs say

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

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

    如果您在课堂上组织测试(或者只是在SampleClass 之外的顶级object,或者只是在文件的顶级中,您可能希望将text 粘贴到companion object如果你真的想要——就在某个地方,任何其他类都可以以“静态”方式访问它

    【讨论】:

      【解决方案2】:

      我们可以使用三种方式

      1. 使用 NestedRunner this

      2. 使用 HierarchicalContextRunner this

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

        @RunWith(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)
             }
         }
        

        }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 2017-10-20
        • 2012-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多