簡體   English   中英

模擬一個構造函數並返回一個模擬對象而不是帶有 mockk 的真實對象

[英]Mock a constructor and return a mocked object instead of real object with mockk

我對一個我想測試的類提出了挑戰,但在該類內部將創建其他對象。

這個簡單的例子說明了這個問題。

class A {
    val b: B
    init() {
      b = B()
    }
}

這只是一個例子,我知道依賴注入會有所幫助。 但在現實生活中,這是一個非常復雜的類,不能輕易改變。

我的想法是使用mockkConstructor 但這不是訣竅。

fun `test construction`() {
    mockkConstructor(B::class)
    every { anyConstructed<B>() } returns mockk<B>()

    val a = A()
}

不幸的是,它無法編譯。 錯誤:每個 {...} 塊內都缺少模擬調用:確保塊內的對象是模擬

我這樣試過

fun `test construction`() {
    mockkConstructor(B::class)
    every { A() } returns mockk<B>()

    val a = A()
}

但是這樣它在A的init方法中調用了A的真實構造函數,也調用了B的真實構造函數。

有誰知道是否有可能以這種方式或類似方式解決它?

所以我對這些示例類進行了測試:

class A {
    val b: B
    init {
        b = B()
    }
}
class B {
    fun getA(): String {
        return "B"
    }
}

測試:

@Test
fun test() {
    mockkConstructor(A::class)
    val b = mockk<B>()
    every { anyConstructed<A>().b } returns b
    every { b.getA() } returns "MOCKK"

    val a = A()

    Assert.assertEquals("MOCKK", a.b.getA())
}

在調用mockkConstructor(B::class)已經使B的構造函數返回由anyConstructed<B>()表示的原型模擬之后,您嘗試模擬B()以返回B的模擬是完全多余的。

這意味着,您只需要anyConstructed<B>()來指定對該模擬的調用行為,例如

every { anyConstructed<B>().someFunctionCall() } returns 1

有關更多詳細信息,請參閱MockK 文檔:構造函數模擬

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM