问题:每个 { ... } 块内缺少模拟调用:确保块内的对象是模拟对象 io.mockk.MockKException:每个 { ... } 块内缺少模拟调用:确保块内的对象是模拟对象
我的代码:
@Test
fun testGetRocketsEmitsOnNullData() = runTest {
val mockData = mockk<RocketsQuery.Data> {
every { rockets } returns emptyList()
}
val mockResponse = mockk<ApolloResponse<RocketsQuery.Data>>() {
coEvery { data } returns mockData
}
val apolloClient = mockk<ApolloClient>()
val repo = RocketsRepositoryImpl(apolloClient)
coEvery { apolloClient.query(any<RocketsQuery>()).execute() } returns mockResponse
val result = repo.getRockets().first()
assertTrue(result.items.isEmpty())
}
问题在这里:
coEvery { data } returns mockData
我使用 coEvery 来使用挂起函数。 我正在尝试获取 graphql 数据并测试空值。
通常,Kotlin 属性有一个隐式的、编译器生成的 getter。在 JVM 上,属性
val data
将有一个 Java 方法 getData()
。当你有 coEvery { data } returns mockData
时,这个 getter 方法就会被嘲笑。
ApolloResponse
的情况下,data
是 @JvmField
。因此,它没有 getter 方法,因此不能被模拟。
要解决此限制,您需要使用
AppoloResponse
创建自己的虚拟 Builder
实例。