简体   繁体   English

调用其他方法时模拟调用 lambda

[英]Mockk call lambda when other method is called

I'm trying to create this MockController with mockk to avoid create a new class for testing.我正在尝试使用 mockk 创建这个 MockController 以避免创建一个新的测试类。

Is possible to do that?有可能这样做吗?

class MockController : IController {
    override lateinit var output: (String) -> Unit

    override fun start() {
        output("OK")
    }
}

Class to test:测试类:

class ClassToTest(
    private val controller: IController,
    private val output: (String) -> Unit
){

    fun start() {
        controller.output = { result ->
            output(result)
        }
        controller.start()
    }
}

Then I use like this TEST example:然后我像这样使用 TEST 示例:

 @Test
    fun checkOutputIsCalled() {
      runBlocking {
        var outputCalled = false

        val outputClassToTest: (String) -> Unit = {
          outputCalled = true
        }

        val classToTest = ClassToTest(MockController(), outputClassToTest)
        classToTest.start()

        delay(1000)
        assert(outputCalled)
    }
}

I'm trying to update:我正在尝试更新:

 @Test
    fun checkOutputIsCalled() {
      runBlocking {
        val controller = spyk<IController>()

        var outputCalled = false

        val outputClassToTest: (String) -> Unit = {
          outputCalled = true
        }

        val classToTest = ClassToTest(controller, outputClassToTest)

        every { controller.start() } answers {
                controller.output.invoke("OK")
        } //When I execute the test, output is null because yet doesn't exist the output creted inside ClassToTest

        classToTest.start()

        delay(1000)
        assert(outputCalled)
    }
}

When I execute the test, output is null because yet doesn't exist the output creted inside ClassToTest当我执行测试时,输出为空,因为在 ClassToTest 中创建的输出尚不存在

How this could be after the output assign?输出分配后怎么会这样?

Thanks!谢谢!

You should mock your output object and your Controller.你应该模拟你的输出对象和你的控制器。 Once done, tell your mocked controller to return the mocked output when property is called.完成后,告诉您的模拟控制器在调用属性时返回模拟输出。 Right after the start() invocation you can verify that output lambda was invoked.在 start() 调用之后,您可以验证是否调用了输出 lambda。 Please note that all your mocks must be relaxed.请注意,您所有的模拟都必须放松。

class ClassToTestTesting {

    companion object {
        const val INVOCATION_PARAM = "OK"
    }

    @Test
    fun test() = runBlocking {
        val paramOutput: (String) -> Unit = mockk(relaxed = true)

        val controller: IController = mockk(relaxed = true) {
            every { output } returns paramOutput
            every { start() } answers { output.invoke(INVOCATION_PARAM) }
        }

        val classToTest = ClassToTest(
            controller,
            paramOutput
        )

        classToTest.start()
        verify { paramOutput(INVOCATION_PARAM) }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM