如何用MockK Mock Firestore中DocumentSnapshot的toObject方法?
解决MockK中Firestore DocumentSnapshot.toObject()的Mock问题
问题出在你只Mock了Firestore调用链到get()的部分,但返回的DocumentSnapshot是未配置方法应答的Mock对象,调用toObject()时找不到对应的处理逻辑,因此抛出MockKException。
解决步骤
- 创建并配置Mock的DocumentSnapshot:为
DocumentSnapshot的toObject(Class<T>)方法指定返回值。 - 将配置好的DocumentSnapshot传入mockTask:让Firestore的
get()调用返回包含该Mock实例的Task。
完整代码示例
// 1. 配置Mock的DocumentSnapshot,指定toObject的返回值 val mockDocumentSnapshot: DocumentSnapshot = mockk { // 匹配具体的MyClass类型,返回预设的测试对象 every { toObject(MyClass::class.java) } returns MyClass( // 填充测试用的属性值,示例: id = "test-doc-id", content = "mock-content" ) // 若需要匹配任意Class参数(可选),可使用any() // every { toObject(any<Class<*>>()) } returns MyClass(...) } // 2. 配置MockFirestore,返回包含上述DocumentSnapshot的Task val mockFirestore: FirebaseFirestore = mockk { coEvery { collection(path) .document(documentId) .get() } returns mockTask(mockDocumentSnapshot) }
关键说明
mockk { ... }用于创建Mock对象并在初始化块中配置方法应答。every { ... } returns ...是MockK为同步方法配置返回值的语法(toObject()是同步方法,无需用coEvery)。mockTask()负责将Mock的DocumentSnapshot包装成Firestore的Task对象,确保await()能正常获取结果。
内容的提问来源于stack exchange,提问作者Alexandru Gheorghe
相关产品推荐
相关产品推荐

