使用Mockk库模拟JUnit测试中除一个方法外的所有方法

ha5z0ras  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(190)

如何使用Mockk库来模拟或窥探某些方法,但使用同一类中另一个方法的真实的逻辑?
下面是一个简化的父子类逻辑:

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,而模拟的method2method3呢?

kq4fsx7k

kq4fsx7k1#

用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

相关问题