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