MockK mock含UByteArray参数方法时签名匹配失败如何解决?
问题原因
Kotlin的无符号类型(UByteArray、UByte等)属于内联值类,JVM底层会用对应的有符号类型(ByteArray、Byte)实现,编译期会对方法名做特殊后缀改编(即错误信息中出现的send-GBYM_sE后缀)用于区分重载。你定义的send(UByteArray)编译后,JVM层面的实际方法签名是send-GBYM_sE(ByteArray),参数类型为ByteArray。
普通的any()、any<UByteArray>()、ofType(UByteArray::class)匹配器只会匹配代码中声明的UByteArray类型,和编译后的实际签名不匹配,因此抛出签名匹配错误。直接传入UByteArray实例时MockK会自动处理值类的装箱拆箱逻辑,因此可以正常匹配。
解决方案
- 方案1(推荐,适用于MockK 1.12.0及以上版本):使用MockK内置的无符号类型专属匹配器
anyUByteArray()替换原有匹配器即可:
@Test fun send_oneMessage(): Unit = runBlocking { val byteStream = mockk<MyDescriptor>() every { byteStream.send(anyUByteArray()) } just Runs }
- 方案2(兼容低版本MockK):直接匹配编译后的底层ByteArray类型,或用match函数手动校验:
// 匹配底层ByteArray类型 every { byteStream.send(any<ByteArray>()) } just Runs // 手动匹配类型 every { byteStream.send(match { it is UByteArray }) } just Runs
- 方案3:如果没有强制使用无符号类型的业务需求,直接将接口参数改为ByteArray,无需额外适配即可正常使用MockK常规匹配器。
内容的提问来源于stack exchange,提问作者JonasVautherin
相关产品推荐
相关产品推荐

