Unit testing 单元测试-如何构造Firebase模拟?

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

我正在使用Mockito框架对我的应用程序进行单元测试

TL;博士 我应该为类的每个可能结果创建一个模拟,并在@Before中设置它们的行为,还是应该为每个类创建一个模拟,然后在使用它们的每个测试中定义它们的行为

上下文 现在我正在测试
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+收集+任务等相反),但这似乎非常不受欢迎,我明白为什么

也许还有第三条路我不知道。非常感谢您的任何建议

多谢各位