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

使用MockK验证挂起API调用时报只能在协程体内调用错误如何解决?

问题原因

  • 你要验证的apiServiceInterface.getDataFromApi()是suspend挂起函数,MockK提供的普通verify方法的Lambda作用域不属于协程上下文,无法直接调用挂起函数,因此触发该报错。
  • 另外你当前的测试类缺少MockK的初始化配置,@MockK和@InjectMockKs注解无法自动生效,运行时会触发空指针异常。

修复方案

  1. 引入MockK针对挂起函数的验证方法coVerify替换原有普通verify
  2. 测试类加上MockK的运行器/扩展注解完成初始化
  3. 可选:如果使用1.6.0+版本的kotlinx-coroutines-test,已废弃的runBlockingTest可以替换为runTest

修复后完整测试代码

import com.example.breakingbad.api.ApiServiceInterface
import com.example.breakingbad.data.DataRepository
import io.mockk.coVerify
import io.mockk.impl.annotations.InjectMockKs
import io.mockk.impl.annotations.MockK
import io.mockk.junit5.MockKExtension
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith

// JUnit5用ExtendWith,JUnit4替换为 @RunWith(MockKJUnit4Runner::class)
@ExtendWith(MockKExtension::class)
class DataRepositoryTest {
    @MockK
    private lateinit var apiServiceInterface: ApiServiceInterface

    @InjectMockKs
    private lateinit var dataRepository: DataRepository

    @Test
    fun getCharacters() = runTest {
        val response = dataRepository.getCharacters()
        // 用coVerify验证挂起函数调用
        coVerify { apiServiceInterface.getDataFromApi() }
    }
}

如果你需要保留旧版的runBlockingTest,只需要把runTest替换回去,coVerify的用法不变。

内容的提问来源于stack exchange,提问作者BRDroid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:51:02