You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:36:03