我使用Mockito框架对我的应用程序进行单元测试。
我应该为每个可能的类结果创建一个模拟并在@Before中设置它们的行为,还是应该为每个类创建一个模拟,然后在每个使用它们的测试中定义它们的行为?
现在我正在测试有DataRepository
的{{1}}。 getPosts(String postId)
通过DI收到DataRepository
个实例。
FirebaseFirestore
使用以下代码返回getPosts
:
Maybe<List<Post>>
要测试此函数和各种情况(成功/空/失败),我必须模拟FirebaseFirestore,然后是CollectionReference,然后是Task,然后是OnCompleteListener(带有参数captor),依此类推。基本上一切。
当我嘲笑任务时,我应该
一个。创建一个{@ 1}},我在@Before中设置为永远成功,一个为失败?有效/空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())
}
}
}
}
/ successfulTaskMock
?
湾只创建一个validQuerySnapshot
,然后直接在测试中更改其返回值? (使taskMock.isSuccessful在成功测试中返回true,在失败测试中返回false)
我看过一些GitHub回购:有些做了。有些做了b。
问题。我最终会为同一个班级提供大量的模拟,但是测试非常简洁易读。
b的问题。我应该在每次测试开始时设置每个模拟,因此有很多模板代码。
我已经读过,我可以使用深度模拟来创建调用的最终结果(QuerySnapshot,而不是Firestore + Collection + Task等),但这似乎非常不受欢迎,我可以理解为什么
也许甚至还有第三种我不知道的方式。任何建议都非常感谢。
非常感谢。