本文介绍了测试FireBase数据库抛出错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在我的项目中使用Firebase,我正在测试包括FireBase组件在内的所有功能,最近我试图测试FireBase数据库,但它引发了一个错误,如果有人可以帮助我,我将无法理解,我将不胜感激,谢谢您
- 我收到错误
Attempt to invoke virtual method 'com.google.firebase.database.DatabaseReference com.google.firebase.database.DatabaseReference.child(java.lang.String)' on a null object reference
at com.revert.journey.app.chatui.ChatHomeActivityTest.testCaseSendMessage
- 这是我的测试代码
@Test
fun testCaseSendMessage(){
val databaseMock = mock(DatabaseReference::class.java)
ServiceLocator.reference = databaseMock
`when`(databaseMock.child("Messages").child("1251515").setValue(Utils.message()))
.thenReturn(isNotNull())
}
- 这是我的真实代码
val messageMap = hashMapOf<String,Any>()
messageMap["userName"] = userName
messageMap["userMessage"] = message
messageMap["userPic"] = userPic
messageMap["messageTiming"] = Calendar.getInstance().timeInMillis.toString()
messageMap["chatImage"] = downloadUrl
messageMap["uid"] = firebaseAuth.currentUser!!.uid
ServiceLocator.reference
.child("Messages")
.child(System.currentTimeMillis().toString())
.setValue(messageMap).await()
- ServiceLocator类
object ServiceLocator {
var firebaseAuth = FirebaseAuth.getInstance()
var reference = FirebaseDatabase.getInstance().reference
}
- 来自我的Firebase的图像示例
- 更新
var base = ServiceLocator.reference.child("Messages")
var child = base.child(System.currentTimeMillis().toString())
child.setValue(messageMap).await()
推荐答案
如果您想要模拟整个调用链,可以为中间状态创建模拟,如下所示(我不知道这里用于实时数据库的所有正确类型,但类似的方法适用于FiRestore)
val databaseMock = mock(DatabaseReference::class.java)
val childMock = mock(Reference::class.java)
val mockTask = mock(??) // set type to whatever "setValue" returns
doReturn(childMock).`when`(databaseMock).child(anyString())
doReturn(childMock).`when`(childMock).child(anyString())
doReturn(mockTask).`when`(childMock).setValue(any())
如果要实际测试是否设置了正确的值,可以向模拟添加侦听器以截获传递给它的实际值
doAnswer { invocation ->
val args = invocation.arguments
val l = args[0] as Map<String,Any>
//add tests here to assert that the map values you sent are correct
null
}.`when`(childMock).setValue(any())
调试提示
如果您想要诊断在这样的场景中发生了什么,您可以将实际代码中的链接调用更改为类似下面的代码。然后,如果其中一个调用返回NULL,您将确切知道是哪个调用,并可以为其添加缺失的模拟。
val db = ServiceLocator.reference
val cm = db.child("Messages")
val ct = cm.child(System.currentTimeMillis().toString())
val response = ct.setValue(messageMap)
response.await()
这些调用都不应该在测试中访问您的数据库,因此实际的数据库模式并不重要。重要的是正确设置模拟(因为您无论如何都在使用模拟数据库)
这篇关于测试FireBase数据库抛出错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!