如何用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
相关产品推荐
相关产品推荐

