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

如何使用Mockk模拟存在重载的全局函数?

Mockk模拟重载全局函数的解决方案

当全局函数存在重载(比如kotlinx.coroutines中的delay(Long)和delay(Duration))时,直接调用mockkStatic(::delay)会触发重载解析歧义错误。以下是两种可行的解决方法:

方法1:显式指定函数类型消除歧义

通过将函数引用转换为特定的挂起函数类型,明确告知编译器要模拟的重载版本:

  • 模拟接收Long参数的delay:
import kotlinx.coroutines.delay

val delayLong: suspend (Long) -> Unit = ::delay
mockkStatic(delayLong) {
    coEvery { delay(any<Long>()) } returns Unit
    // 执行你的测试逻辑
}
  • 模拟接收Duration参数的delay:
import kotlin.time.Duration
import kotlinx.coroutines.delay

val delayDuration: suspend (Duration) -> Unit = ::delay
mockkStatic(delayDuration) {
    coEvery { delay(any<Duration>()) } returns Unit
    // 执行你的测试逻辑
}

这种方式具备类型安全性,能在编译阶段就确保选中正确的重载。

方法2:使用函数全限定签名字符串

Mockk支持通过函数的全限定签名字符串来指定目标重载,注意签名需包含完整的参数类型包名:

  • 模拟delay(Long):
mockkStatic("kotlinx.coroutines.delay(Long)") {
    coEvery { delay(1000L) } returns Unit
    // 测试逻辑
}
  • 模拟delay(Duration):
mockkStatic("kotlinx.coroutines.delay(kotlin.time.Duration)") {
    coEvery { delay(Duration.parse("1s")) } returns Unit
    // 测试逻辑
}

这种方式更直接,但需要确保签名字符串完全准确,否则会模拟失败。

内容的提问来源于stack exchange,提问作者mmm111mmm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:48:58