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

Kotlin Multiplatform项目使用Mokkery Mock库时遭遇NotSingleCallInEveryBlockException错误求助

Kotlin Multiplatform项目使用Mokkery Mock库时遭遇NotSingleCallInEveryBlockException错误求助

嘿,我之前在KMP项目里用Mokkery的时候也踩过这个坑!先给你拆解下问题,再直接上修复后的代码:

问题根源

你看到的NotSingleCallInEveryBlockException,虽然提示是“every块里只能有一个mock调用”,但你的代码里看起来只有clock.now()这一个调用对吧?其实问题出在如果你的Clock.now()是一个挂起函数,普通的every是不支持协程挂起调用的,Mokkery会把挂起调用的内部逻辑误判为多个调用,从而抛出这个错误。

Mokkery针对挂起函数专门提供了coEvery来替代every,这才是协程环境下配置mock返回值的正确方式。

修复后的测试代码

import dev.mokkery.mock
import dev.mokkery.coEvery
import kotlin.test.BeforeTest
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlinx.coroutines.test.runTest

class MyTest {
    private lateinit var clock: Clock

    @BeforeTest
    fun setup() {
        clock = mock()
    }

    @Test
    fun `test`() = runTest {
        val initialTime = Clock.System.now()
        // 替换为coEvery适配挂起函数调用
        coEvery { clock.now() } returns initialTime
        assertEquals(clock.now(), initialTime)
    }
}

额外检查点

如果换了coEvery还是报错,你可以再排查下:

  • 确保every/coEvery的大括号里真的只有一行mock对象的调用代码,别不小心加了打印、变量赋值之类的额外逻辑
  • 确认你的Clock接口的now()函数是否被标记为suspend:如果是非挂起函数,那用every是没问题的,这时候就要检查mock初始化的模式是否正确(默认mock模式一般都能满足需求)

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 11:24:39