我在我的專案中使用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()
- 服務定位器類
object ServiceLocator {
var firebaseAuth = FirebaseAuth.getInstance()
var reference = FirebaseDatabase.getInstance().reference
}
- 來自我的火力基地的影像樣本

- 更新
var base = ServiceLocator.reference.child("Messages")
var child = base.child(System.currentTimeMillis().toString())
child.setValue(messageMap).await()
uj5u.com熱心網友回復:
如果你想模擬完整的呼叫鏈,你可以像這樣為中間狀態創建模擬(我不知道這里用于實時資料庫的所有正確型別,但類似的方法適用于 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()
這些呼叫都不應該在測驗中訪問您的資料庫,因此實際的資料庫架構無關緊要。重要的是正確設定模擬(因為無論如何您都在使用模擬資料庫)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/411333.html
標籤:
