单元测试 - 如何构建Firebase模拟器?

时间:2018-04-13 08:06:40

标签: unit-testing firebase junit mockito google-cloud-firestore

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

TL; DR

我应该为每个可能的类结果创建一个模拟并在@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等),但这似乎非常不受欢迎,我可以理解为什么

也许甚至还有第三种我不知道的方式。任何建议都非常感谢。

非常感谢。

0 个答案:

没有答案