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

如何用Mockk模拟带Context Receiver的方法?测试遇CallContext实例难题

解决Mockk模拟带Context Receiver方法的问题

问题原因

你尝试用any<CallContext>()作为with的上下文对象,但any<T>()是Mockk的参数匹配器,并非真实的CallContext实例,因此无法通过编译。

可行解决方案

方案1:创建模拟的CallContext实例

使用Mockk直接生成CallContext的模拟对象,作为上下文传入with块:

// 1. 创建模拟的CallContext实例
val mockCallContext = mockk<CallContext>()

// 2. 在模拟上下文环境中配置方法行为
with(mockCallContext) {
    every { mockedMyClass.myMethod(1) } returns 2
}

// 3. 测试调用时同样在该上下文环境中执行
with(mockCallContext) {
    assertEquals(2, mockedMyClass.myMethod(1))
}

方案2:使用空实现的CallContext(适用于接口/开放类)

如果CallContext是接口或允许空实现,可以直接创建一个无逻辑的实例:

// 创建空实现的上下文实例
val dummyCallContext = object : CallContext {}

with(dummyCallContext) {
    every { mockedMyClass.myMethod(1) } returns 2
}

补充说明

Mockk对Context Receiver方法的模拟依赖真实的上下文实例(或模拟实例),因为Kotlin的Context Receiver语法本质是将上下文作为隐式参数传递,Mockk需要这个隐式参数的载体来完成方法行为的配置和验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:55:15