簡體   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