使用MockK验证挂起API调用时报只能在协程体内调用错误如何解决?
问题原因
- 你要验证的
apiServiceInterface.getDataFromApi()是suspend挂起函数,MockK提供的普通verify方法的Lambda作用域不属于协程上下文,无法直接调用挂起函数,因此触发该报错。 - 另外你当前的测试类缺少MockK的初始化配置,
@MockK和@InjectMockKs注解无法自动生效,运行时会触发空指针异常。
修复方案
- 引入MockK针对挂起函数的验证方法
coVerify替换原有普通verify - 测试类加上MockK的运行器/扩展注解完成初始化
- 可选:如果使用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
相关产品推荐
相关产品推荐

