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

Android项目升级Gradle及Kotlin后Mockk测试失败求助

问题原因及解决方法

核心失败原因

  1. Mockk依赖版本不兼容:当前使用的mockk(1.13.7)和mockk-android(1.12.0)版本不一致,旧版本的mockk-android与升级后的Kotlin 1.8存在兼容性问题,会导致验证逻辑异常。
  2. verifyOrder块内使用条件分支:Mockk的verifyOrder要求块内是固定的调用验证序列,不支持if/else这类动态条件判断,这种写法会让Mockk无法正确解析验证规则,即便实际逻辑符合预期,测试也会判定失败。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:56:32