mockkConstructor()在every代码块中失效问题求助
问题分析与解决方案
首先看你代码里的几个明显拼写错误,这是导致报错的直接原因:
mockkConstrutor应该是mockkConstructoranycontructed应该是anyConstructed
Mockk的DSL对拼写敏感,错误的函数名会让框架无法识别你要拦截的构造调用,从而抛出Missing mocked calls inside every { ... } block的错误。
另外,要实现类似PowerMockito whenNew()的效果,还需要注意以下几点:
1. 修正基础代码
先把测试类里的mock定义和构造拦截代码修正:
测试类的Mock实例定义
注意访问修饰符是小写private(你写的Private是语法错误):
private val managerMock: Manager by lazy { mockk<Manager>() }
正确的构造函数拦截代码
在测试初始化阶段(比如@Before方法里)执行拦截逻辑,确保在被测试类的lazy属性初始化前完成设置:
@Before fun setup() { // 启用Manager类的构造函数mock mockkConstructor(Manager::class) // 拦截所有Manager构造调用,返回自定义mock实例 every { anyConstructed<Manager>() } returns managerMock }
2. 确保Lazy属性的初始化时机
因为被测试类的manager是lazy加载的,必须保证:
- 构造函数拦截逻辑先于被测试类实例创建(或者先于
manager属性第一次访问) - 如果测试方法之间需要重置状态,可在
@After方法里调用unmockkConstructor(Manager::class)清除构造mock
3. 针对Mockk 1.10.6的特殊注意事项
Mockk 1.10.x版本的构造函数拦截对参数匹配支持有限,如果你的Manager构造函数有明确参数,也可以直接指定参数匹配来更精准拦截:
every { constructor<Manager>(any<Data>(), any<Context>()) } returns managerMock
这样可以确保只有匹配参数的构造调用才会返回你的mock实例,避免影响其他地方的Manager构造。
内容的提问来源于stack exchange,提问作者Dave_August
相关产品推荐
相关产品推荐

