如何模拟或间谍一些方法,但在使用mock库的同一类中使用另一个方法的实际逻辑?
下面是我拥有的一个简化的父子类逻辑:
open class Parent() {
var condition = true
fun method1() {
if (condition) {
method2("bum")
} else {
method3(41)
}
}
fun method2(someStr: String): String {
//some complicated logic
return "some result"
}
fun method3(someInt: Int): Int {
//some complicated logic
return 42
}
}
class Child: Parent() { }
和我想要的测试:
@Test
fun `when condition is true, it should call method2`() {
clearAllMocks()
val child: Child = mockk()
child.condition = true
every { child.method2(any()) } returns "something"
every { child.method3(any()) } returns 11
child.method1()
verify(exactly = 1) { child.method2(any()) }
}
当然,这种测试逻辑不起作用。但是我怎么能调用真正的method1
而模拟method2
和method3
呢?
用Mockk模拟一些方法的方法,除了一个:
@Test
fun `when condition is true, it should call method2`() {
clearAllMocks()
val child: Child = spyk()
every { child.condition } returns true
every { child.method2(any()) } returns "something"
every { child.method3(any()) } returns 11
//every { child.method1() } answers { callOriginal() } - this works with and without this line
child.method1()
verify(exactly = 1) { child.method2(any()) }
}
可以使用spyk
,并且必须模拟需要使用every
模拟的方法的行为。对于非模拟方法,不添加任何内容或确保其行为是明确的-您可以添加callOriginal