如何 运行 在 Android Firebase Kotlin 上进行单元测试?
How to run unit tests on Android Firebase Kotlin?
所以我正在使用 Firebase 后端构建一个聊天应用程序。在实施 ViewModel 和实际片段之前,我想检查我的 Firebase 存储库是否有效。我争取用户的电话会这样
Fragmet -> ViewModel -> Repository -> FirebaseRepository -> suspend fun getAllUsers() : ArrayList
密码是:
class Repository(val firebaseRepository : FirebaseRepository) {
suspend fun getAllUsersFromFirebase() : ArrayList<UserInfo> {
return firebaseRepository.getAllUsers()
}
}
class FirebaseRepository() {
private val TAG = "FIREBASE REPOSITORY : "
private val firebaseAuth:FirebaseAuth = FirebaseAuth.getInstance()
private val firebaseDatabase :FirebaseDatabase = FirebaseDatabase.getInstance()
suspend fun getAllUsers() : ArrayList<UserInfo> {
val ref = firebaseDatabase.getReference("/users")
val userList = ArrayList<UserInfo>()
ref.addListenerForSingleValueEvent(object : ValueEventListener{
override fun onDataChange(snapshot: DataSnapshot) {
if(snapshot.exists()) {
Log.d(TAG,"$snapshot")
val tempList = ArrayList<UserInfo>()
for(child in snapshot.children){
val temp = child.getValue(UserInfo::class.java)
if(!temp?.userId!!.equals(firebaseAuth.currentUser!!.uid)) {
tempList.add(temp)
}
}
}
}
override fun onCancelled(error: DatabaseError) {
Log.d(TAG,"$error ${error.message}")
}
})
if(userList.isEmpty()) {
userList.add(UserInfo("NO USER FOUND","NO USER FOUND","NO USER FOUND","NO USER FOUND"))
}
return userList
}
}
那么我该如何测试呢?我猜测 firebaseAuth 可能会带来问题。我想我可以处理它,但我该如何测试这个 firebase 调用?
I want to check whether my firebase Repository works or not.
它不会工作,因为您返回 userList
作为方法的结果,这实际上是不可能的,因为 Firebase API 是异步的。所以这里的问题是你附加的侦听器在查询完成后的一段未知时间被调用,你永远不会知道它需要多长时间。根据您的连接速度和状态,可能需要几百毫秒到几秒才能获得该数据。
也就是说,在调用回调之前,您的 userList
将是空的。这意味着您应该始终使用回调中的结果。我写了一篇关于这个主题的文章,它可以帮助你理解这个概念:
如果你想创建一个单元测试,那么我建议你使用 mockito 并使用来自以下 post 的答案:
P.S。您的 getAllUsers()
方法不需要是一种暂停乐趣,因为您没有在那里使用任何 await() 。如果您想使用它,我建议您阅读以下文章:
所以我正在使用 Firebase 后端构建一个聊天应用程序。在实施 ViewModel 和实际片段之前,我想检查我的 Firebase 存储库是否有效。我争取用户的电话会这样
Fragmet -> ViewModel -> Repository -> FirebaseRepository -> suspend fun getAllUsers() : ArrayList
密码是:
class Repository(val firebaseRepository : FirebaseRepository) {
suspend fun getAllUsersFromFirebase() : ArrayList<UserInfo> {
return firebaseRepository.getAllUsers()
}
}
class FirebaseRepository() {
private val TAG = "FIREBASE REPOSITORY : "
private val firebaseAuth:FirebaseAuth = FirebaseAuth.getInstance()
private val firebaseDatabase :FirebaseDatabase = FirebaseDatabase.getInstance()
suspend fun getAllUsers() : ArrayList<UserInfo> {
val ref = firebaseDatabase.getReference("/users")
val userList = ArrayList<UserInfo>()
ref.addListenerForSingleValueEvent(object : ValueEventListener{
override fun onDataChange(snapshot: DataSnapshot) {
if(snapshot.exists()) {
Log.d(TAG,"$snapshot")
val tempList = ArrayList<UserInfo>()
for(child in snapshot.children){
val temp = child.getValue(UserInfo::class.java)
if(!temp?.userId!!.equals(firebaseAuth.currentUser!!.uid)) {
tempList.add(temp)
}
}
}
}
override fun onCancelled(error: DatabaseError) {
Log.d(TAG,"$error ${error.message}")
}
})
if(userList.isEmpty()) {
userList.add(UserInfo("NO USER FOUND","NO USER FOUND","NO USER FOUND","NO USER FOUND"))
}
return userList
}
}
那么我该如何测试呢?我猜测 firebaseAuth 可能会带来问题。我想我可以处理它,但我该如何测试这个 firebase 调用?
I want to check whether my firebase Repository works or not.
它不会工作,因为您返回 userList
作为方法的结果,这实际上是不可能的,因为 Firebase API 是异步的。所以这里的问题是你附加的侦听器在查询完成后的一段未知时间被调用,你永远不会知道它需要多长时间。根据您的连接速度和状态,可能需要几百毫秒到几秒才能获得该数据。
也就是说,在调用回调之前,您的 userList
将是空的。这意味着您应该始终使用回调中的结果。我写了一篇关于这个主题的文章,它可以帮助你理解这个概念:
如果你想创建一个单元测试,那么我建议你使用 mockito 并使用来自以下 post 的答案:
P.S。您的 getAllUsers()
方法不需要是一种暂停乐趣,因为您没有在那里使用任何 await() 。如果您想使用它,我建议您阅读以下文章: