装置失败 - 缺少模拟呼叫

问题描述 投票:0回答:1

问题:每个 { ... } 块内缺少模拟调用:确保块内的对象是模拟对象 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 数据并测试空值。

android kotlin unit-testing graphql mocking
1个回答
0
投票

通常,Kotlin 属性有一个隐式的、编译器生成的 getter。在 JVM 上,属性

val data
将有一个 Java 方法
getData()
。当你有
coEvery { data } returns mockData
时,这个 getter 方法就会被嘲笑。

不幸的是,在

ApolloResponse
的情况下,
data
@JvmField
。因此,它没有 getter 方法,因此不能被模拟。

要解决此限制,您需要使用

AppoloResponse
创建自己的虚拟
Builder
实例。

© www.soinside.com 2019 - 2024. All rights reserved.