首页 > 解决方案 > 与 UByteArray 但不与 ByteArray 匹配模拟签名失败

问题描述

模拟以下界面时:

interface MyDescriptor {
    fun receive(): UByteArray
    fun send(bytes: UByteArray)
}

使用以下测试代码:

    @Test
    fun send_oneMessage(): Unit = runBlocking {
        val byteStream = mockk<MyDescriptor>()
        every { byteStream.send(any()) } just Runs
    }

我收到以下错误:

io.mockk.MockKException: Failed matching mocking signature for
SignedCall(retValue=, isRetValueMock=true, retType=class kotlin.Unit, self=MyDescriptor(#1), method=send-GBYM_sE(ByteArray), args=[null], invocationStr=MyDescriptor(#1).send-GBYM_sE(null))
left matchers: [any()]

现在,如果any()我不使用实际的UByteArray,它会运行:

    @Test
    fun send_oneMessage(): Unit = runBlocking {
        val payload = "Payload message"
        val byteStream = mockk<MyDescriptor>()
        every { byteStream.send(payload.toByteArray().toUByteArray()) } just Runs
    }

我不禁注意到这部分错误:method=send-GBYM_sE(ByteArray), args=[null],它提到 aByteArray而不是 a UByteArray,就像它正在寻找错误的函数签名(因此出现错误),但我不明白为什么。更改any()forany<UByteArray>()会导致相同的错误,就像使用ofType(UByteArray::class)...

但是,它适用于ByteArray而不是UByteArray

interface MyDescriptor {
    fun receive(): UByteArray
    fun send(bytes: ByteArray)
}

我错过了什么吗?

注意:错误与此问题相似,但我的测试代码完全不同,因此是新问题。

标签: kotlinmockk

解决方案


MockK 目前不支持无符号类型,这是一个未解决的问题。


推荐阅读