我尝试为从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)
型
1条答案
按热度按时间35g0bw711#
问题是要测试的代码中的强制转换不正确。
我有过
字符串
相应修正
型
并且测试按预期工作。
我也必须改变这个
型
到这个
型