Android项目升级Gradle及Kotlin后Mockk测试失败求助
问题原因及解决方法
核心失败原因
- Mockk依赖版本不兼容:当前使用的
mockk(1.13.7)和mockk-android(1.12.0)版本不一致,旧版本的mockk-android与升级后的Kotlin 1.8存在兼容性问题,会导致验证逻辑异常。 verifyOrder块内使用条件分支:Mockk的verifyOrder要求块内是固定的调用验证序列,不支持if/else这类动态条件判断,这种写法会让Mockk无法正确解析验证规则,即便实际逻辑符合预期,测试也会判定失败。wasNot Called的用法错误:在verifyOrder中直接使用cb.invoke(any()) wasNot Called不符合Mockk的验证规范,这种未调用场景应该单独用精确调用次数验证。
具体解决步骤
1. 统一并升级Mockk依赖
将mockk和mockk-android版本统一为与Kotlin 1.8兼容的最新稳定版(比如1.13.8或更高),修改Gradle依赖配置:
testImplementation("io.mockk:mockk:1.13.8") androidTestImplementation("io.mockk:mockk-android:1.13.8")
2. 重构测试代码,移除verifyOrder内的条件分支
把两种场景的验证逻辑分开处理,避免在verifyOrder中使用动态判断:
it("test desc") { val cb: ((CustomError?) -> Unit) = mockk() every { cb.invoke(any()) } just Runs myClass.loadData(MyOptions.Init(), null, cb) if (resolve) { verifyOrder { harness.miController.sendEvent(BaseEvent.LOAD_DATA, any(), any()) } // 单独验证cb从未被调用 verify(exactly = 0) { cb.invoke(any()) } } else { verifyOrder { harness.miController.sendEvent(BaseEvent.LOAD_DATA, any(), any()) cb.invoke(CustomError.LOAD_DATA) } } }
3. 额外检查点
- 清理项目缓存:执行
File -> Invalidate Caches...并重启Android Studio,避免旧缓存干扰测试执行。 - 确认
CustomError.LOAD_DATA的equals逻辑:如果该枚举/类的equals方法在升级后有变更,可能导致验证不匹配(不过你调试时参数符合预期,这个概率较低)。
内容的提问来源于stack exchange,提问作者MSohm
相关产品推荐
相关产品推荐

