测试FireBase数据库抛出错误 [英] test with firebase database throwing error

查看:68
本文介绍了测试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数据库抛出错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆