首页 > 解决方案 > 如何使用 mockito 测试使用 Kotlin 调用的回调

问题描述

我有一个接受回调的 Kotlin 类,如下所示:

class MyKotlinClass (private val handleSomeCallBack: (ByteArray) -> Unit) {
    private val someBuffer = BytesBuilder()

    fun myFunction(bytesList: List<Byte>) {
        handleSomeCallBack(someBuffer.toArray())
    }
}

我不太清楚如何将 Mockito 与 jUnit 一起使用来测试回调是否被调用。

我觉得我应该使用 anargumentCaptor而不是 spy,但不太确定。

我目前拥有的如下:

@RunWith(MockitoJUnitRunner::class)
class MyKotlinClassTests : BaseTest() {
    private lateinit var myKotlinClass: MyKotlinClass

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
    }

    @Test
    fun `test callback is called when message is passed in`() {
        val captor = argumentCaptor<(data: ByteArray) -> Unit>()

        myKotlinClass = MyKotlinClass(capture(captor))

        val rawDataBytes = byteArrayOf(0x01, 0x02, 0x03, 0x04, 0x05)

        myKotlinClass.myFunction(rawDataBytes.toList())

        verify(captor, once())
    }
}

使用上述内容,我收到以下错误:

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method MyKotlinClass.<init>, parameter handleSomeCallBack

测试我的回调是否被调用并评估与它一起传递的数据的正确方法是什么(someBuffer)?

标签: unit-testingkotlincallbackmockito

解决方案


为此,您不需要mockito。只需创建 lamda 并将您的值存储在列表中,然后断言这些值。

    @Test
    fun `test callback is called when message is passed in`() {
     val captor = arrayListOf<ByteArray>()

     val myKotlinClass = MyKotlinClass ({
        captor.add(it)
     })

     val rawDataBytes = byteArrayOf(0x01, 0x02, 0x03, 0x04, 0x05)

     myKotlinClass.myFunction(rawDataBytes.toList())

    //Assert size
    Assert.assertTrue(captor.size == 1)

    //Assert ByteArray values
}

推荐阅读