代码之家  ›  专栏  ›  技术社区  ›  Janusz Daniel Rindt

如何使用mock调用lambda回调

  •  0
  • Janusz Daniel Rindt  · 技术社区  · 7 年前

    在这个模拟中,我现在调用一个方法,该方法获取一个lambda作为参数。

    此lambda用作回调,将回调的状态更改传递给方法的调用方。

    class ObjectToMock() {
        fun methodToCall(someValue: String?, observer: (State) -> Unit) {
            ...
        }
    }
    

    1 回复  |  直到 7 年前
        1
  •  43
  •   s1m0nw1    4 年前

    你可以用 answers

    val otm: ObjectToMock = mockk()
    every {  otm.methodToCall(any(), any())} answers {
        secondArg<(String) -> Unit>().invoke("anything")
    }
    
    otm.methodToCall("bla"){
        println("invoked with $it") //invoked with anything
    }
    

    答案 您可以访问的范围 firstArg secondArg invoke 这里为了使其更具可读性,也可以省略它。

        2
  •  1
  •   Sylhare    6 年前

    Kotlin Test with Mockk . 就我而言,它更具体一点。 我想检查和嘲弄 成功 自定义回调实现的示例 MyCustomCallback 实施 ListenableFutureCallback

    对于我的客户来说,代码应该是这样的 ExampleProducer 类,它将有一个 send 功能:

     fun send(data: String) {
            val responseFuture  = kafkaTemplate.send(topic, data)
            responseFuture.addCallback(MyCustomCallback())
     }
    

    那么,测试将由谁进行:

    @Test
    fun onFailureTest() {
        kafkaTemplate: KafkaTemplate<String, String> = mockk()
        val captureCallback = slot<ListenableFutureCallback<SendResult<String, String>>>()
    
        every { callback.addCallback(capture(captureCallback)) } answers {
                   captureCallback.captured.onFailure(Throwable())
        }
        every { kafkaTemplate.send(any()) } returns callback
    
        val prod: ExampleProducer = ExampleProducer()
        prod.send("test")
    
        // Then you can verify behaviour or check your captureCallback.captured
        verify { kafkaTemplate.send(any()) }
        assertNotNull(captureCallback.captured)
    }
    
        3
  •  0
  •   Marius K    4 年前

    可能不完全是您所要求的,但您可以使用模拟的funciton类型:

    val observerMock = mockk<(State) -> Unit>()
    
    推荐文章