Unit testing 单元测试-如何构造Firebase模拟?
我正在使用Mockito框架对我的应用程序进行单元测试 TL;博士 我应该为类的每个可能结果创建一个模拟,并在@Before中设置它们的行为,还是应该为每个类创建一个模拟,然后在使用它们的每个测试中定义它们的行为 上下文 现在我正在测试Unit testing 单元测试-如何构造Firebase模拟?,unit-testing,firebase,junit,mockito,google-cloud-firestore,Unit Testing,Firebase,Junit,Mockito,Google Cloud Firestore,我正在使用Mockito框架对我的应用程序进行单元测试 TL;博士 我应该为类的每个可能结果创建一个模拟,并在@Before中设置它们的行为,还是应该为每个类创建一个模拟,然后在使用它们的每个测试中定义它们的行为 上下文 现在我正在测试DataRepository,它有getPosts(stringpostid)DataRepository通过DI接收FirebaseFirestore实例 getPosts返回带有以下代码的Maybe: fun getPosts(companyId: Strin
DataRepository
,它有getPosts(stringpostid)
DataRepository
通过DI接收FirebaseFirestore
实例
getPosts
返回带有以下代码的Maybe
:
fun getPosts(companyId: String): Maybe<List<Post>> {
return Maybe.create { emitter ->
firestore.collection("companies/$companyId/posts").get()
.addOnCompleteListener {
if (it.isSuccessful) {
if (it.result.isEmpty) {
emitter.onComplete()
} else {
emitter.onSuccess(it.result.toObjects(Post::class.java))
}
} else {
emitter.onError(it.exception ?: UnknownError())
}
}
}
}
fun-getPosts(companyId:String):也许吧{
返回Maybe.create{emitter->
firestore.collection(“companys/$companyId/posts”).get()
.addOnCompleteListener{
如果(it.ISSUCCESS){
if(it.result.isEmpty){
emitter.onComplete()
}否则{
onSuccess(it.result.ToObject(Post::class.java))
}
}否则{
emitter.onError(it.exception?:UnknownError())
}
}
}
}
问题
为了测试这个函数和各种情况(成功/空/失败),我必须模拟FirebaseFirestore,然后是CollectionReference,然后是Task,然后是OnCompleteListener(带有参数captor)等等。基本上一切都好
问题:
当我嘲笑这个任务时,我应该
a。创建一个successfulTaskMock
,我在@Before中设置它总是成功的,一个用于失败?有效/空validQuerySnapshot
/emptyQuerySnapshot
的情况也一样
b。仅创建一个taskMock
,然后直接在测试内部更改其返回值?(使taskMock.isSuccessful在成功测试中返回true,在失败测试中返回false)
我看过一些GitHub回购协议:有些做a,有些做b
a的问题。对于同一个类,我最终会得到大量的模拟,但是测试非常干净且可读
b的问题。我应该在每个测试开始时设置每个模拟,因此有很多样板代码
结论
我曾读到,我可以使用深度模拟来只创建调用的最终结果(QuerySnapshot,与Firestore+收集+任务等相反),但这似乎非常不受欢迎,我明白为什么
也许还有第三条路我不知道。非常感谢您的任何建议
多谢各位