【发布时间】:2022-01-16 02:45:16
【问题描述】:
我在我的项目中使用 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()
【问题讨论】:
-
错误是什么?您的毫秒时间可能与您的模拟值“1251515”不匹配,可能想在那里使用
anyString() -
我收到一个错误,即使用 nullpointerexception 调用数据库,我也包含了错误和服务定位器类,谢谢
-
我猜
System.currentTimeMillis().toString()不等于1251515,所以没有应用模拟并且方法返回null。尝试将您的模拟更改为使用anyString()而不是"1251515" -
我确实写了 anyString() ,但它仍然显示相同的错误奇怪
-
好的,下一步是将调用链分解成单独的部分,这样您就可以找出哪个是空的(
val c1 = ServiceLocator.reference.child("Messages")val c2 = c1.child(...)val t = c2.setValue(...)t.await()等)。也许也可以尝试模拟中间状态(doReturn(databaseChild).when(databaseMock).child(anyString()))
标签: android kotlin firebase-realtime-database android-espresso