[英]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.