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

