mockito Kotlin:如何模拟一个类的一个特定方法被另一个方法调用?

kyks70gy  于 2023-04-06  发布在  Kotlin
关注(0)|答案(1)|浏览(173)

我有一个A类,它的方法是m1m2m2m1调用。我必须通过模拟来自m2的响应来测试Main类。
虽然在测试函数中,我确实得到了模拟的响应,但在执行流程中,调用的是原始的m2方法,而不是模拟的方法。
这是我得到的

class A {
    fun m1(input: List<Int>): Int {
        val x = m2(input)
        return x*sum(input)
    }
    
    fun m2(input: List<Int>): Int {
        return 2*sum(input)
    }
}

class Main {
   private val a = A()
   fun run() {
       val res = a.m1(listOf(1,2,3))
       return val
   }
}

@Test
class TestMain {
    val mockA = mockkClass(A::class)
    every { mockA.m2(any()) } returns 20

    // check always returns the current mocked value 20
    val check = mockA.m2(listOf(5,6))
    
    // in this case m1 still calls m2 and not the mocked one
    val res = Main().run()
}

我错过了什么?

dwbf0jvd

dwbf0jvd1#

您正在为类A创建一个模拟对象,但实际上并没有在代码中使用它。
相反,您使用的是在Main类中创建的A的实际示例。要使用mock对象,您必须将其注入Main类。

class A {
    fun m1(input: List<Int>): Int {
        val x = m2(input)
        return x * sum(input)
    }

    open fun m2(input: List<Int>): Int {
        return 2 * sum(input)
    }
}

class Main(private val a: A) {
    fun run(): Int {
        val res = a.m1(listOf(1, 2, 3))
        return res
    }
}

@Test
class TestMain {
    val mockA = mockkClass(A::class)
    every { mockA.m2(any()) } returns 20

    @Test
    fun testRun() {
        val main = Main(mockA)
        val res = main.run()
        assertEquals(20, res)
    }
}

打开m2方法,以便在测试中模拟它。向Main类添加了一个构造函数参数,以允许依赖注入。
当调用Main.run()时,它将使用A.m2()的模拟版本。

相关问题