Unit测试报错Missing mocked calls:MockK协程coEvery使用问题排查
解决MockKException: Missing mocked calls inside every { ... } block错误
问题原因
你遇到的错误是因为在mockk的初始化lambda块中错误使用coEvery配置普通属性的返回值。coEvery仅用于挂起函数的模拟,而ApolloResponse的data是普通属性(非挂起的getter方法),应该用every来配置。
修正方案
将mockResponse初始化块中的coEvery替换为every即可解决问题。同时需明确MockK的规则:普通方法/属性用every,挂起函数用coEvery。
修正后的完整代码
@Test fun testGetRocketsEmitsOnNullData() = runTest { val mockData = mockk<RocketsQuery.Data> { every { rockets } returns emptyList() } val mockResponse = mockk<ApolloResponse<RocketsQuery.Data>> { every { data } returns mockData // 替换coEvery为every } val apolloClient = mockk<ApolloClient>() val repo = RocketsRepositoryImpl(apolloClient) coEvery { apolloClient.query(any<RocketsQuery>()).execute() } returns mockResponse // execute是挂起函数,用coEvery正确 val result = repo.getRockets().first() assertTrue(result.items.isEmpty()) }
额外说明
- 若需模拟挂起函数,不要在
mockk的初始化lambda内使用coEvery,应在初始化块外单独配置。示例:val mockResponse = mockk<ApolloResponse<RocketsQuery.Data>>() coEvery { mockResponse.someSuspendFunction() } returns someValue
内容的提问来源于stack exchange,提问作者Equlo
相关产品推荐
相关产品推荐

