使用mockk对Firebase实时数据库DataSnapshot进行JUnit测试

wwodge7n  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(114)

我尝试为从Firebase实时数据库加载数据的异步函数编写测试。

suspend fun getUsers(): Resource<GETUsers> =
    try {
        val users = databaseReference.get().await().getValue<GETUsers>()!!
        Resource.Success(users)
    } catch(e: Exception) {
        Resource.Error(e.message ?: Constants.UNKNOWN_ERROR)
    }

字符串
我已经为Firebase授权编写了类似的测试,这些测试都有效。但是,当前测试没有返回所需的结果。

@Test
fun `getUsers() called should return success with two users`() {
    val user01 = GETUser()
    val user02 = GETUser()
    val user01ID = "exampleUser01ID"
    val user02ID = "exampleUser02ID"
    val users = mutableMapOf(user01ID to user01, user02ID to user02)
    val expectedResult = GETUsers(users)
    val task: Task<DataSnapshot> = mockkTask()
    val snapshot: DataSnapshot = mockk()

    every { databaseReference.get() } returns task
    every { task.result } returns snapshot
    every { snapshot.getValue<GETUsers>()!! } returns expectedResult

    val result = runBlocking { repository.getUsers() }
    println(result)

    Assert.assertTrue(result is Resource.Success)
    Assert.assertEquals(2, (result as Resource.Success).data.users.size)
    Assert.assertEquals(user01, result.data.users[user01ID])
    Assert.assertEquals(user02, result.data.users[user02ID])
}

private inline fun <reified T> mockkTask(exception: Exception? = null): Task<T> {
    val task = mockk<Task<T>>(relaxed = true) {
        every { isComplete } returns true
        every { this@mockk.exception } returns exception
        every { isCanceled } returns false
        every { result } returns mockk(relaxed = true)
    }
    return task
}


我认为这个错误是因为转换为GETUsers不能正常工作,如果我打印结果,我会得到以下显示:

Error(message=class java.lang.Object cannot be cast to class com.example.social_bike_repair.models.GETUsers (java.lang.Object is in module java.base of loader 'bootstrap'; com.example.social_bike_repair.models.GETUsers is in unnamed module of loader 'app'))


我想我需要修改mockTast函数的这一行,但我不太确定如何修改。

every { result } returns mockk(relaxed = true)

35g0bw71

35g0bw711#

问题是要测试的代码中的强制转换不正确。
我有过

val users = databaseReference.get().await().getValue<GETUsers>()!!

字符串
相应修正

val users = databaseReference.get().await().getValue(GETUsers::class.java)!!


并且测试按预期工作。
我也必须改变这个

every { snapshot.getValue<GETUsers>()!! } returns expectedResult


到这个

every { snapshot.getValue(GETUsers::class.java) } returns expectedResult

相关问题