使用spock的RxJava可流单元测试



我有以下使用com.mongodb.reactivestreams.client.MongoClientFlowable从MongoDB获取数据的片段

片段如下:

Flowable
.fromPublisher(
mongoClient
.getDatabase(mydb)
.getCollection(mycollection)
.find()
.limit()
)
.firstOrError()
.toMaybe()
.doOnError(error -> { /* somecode */ })

我试着嘲笑这种流利表达的每一步,例如

MongoDatabase someDb = Mock(MongoDatabase)
mongoClient.getDatabase(mydb) >> somedb

但在这样做的过程中,测试一直在运行。

使用Spock进行单元测试的正确方法是什么?

Fluent接口是一个要模拟的PITA,我的策略是将这些调用放入一个单独的类/方法中并模拟它。然后在集成测试中测试流畅部分。

除了Leonard的想法之外,您可能还想研究实现一个特殊的ThisResponse implements IDefaultResponse,它总是为每个mock方法调用返回mock实例,并将其像Mock(defaultResponse: ThisResponse.INSTANCE)一样用于流畅的API类。只要测试中使用的fluent API方法应该返回this或至少返回给定类型的另一个对象,这就可以很好地工作。只有在返回了另一个类型的情况下,才需要存根。

查看此答案以了解更多详细信息。一旦你用一点MCVE更新了你的问题,如果你在使用该解决方案时有任何问题,你也可以提出后续问题。


更新2022-03-08:在了解了返回模拟类型的方法的EmptyOrDummyResponse的特殊行为后,我重新编写了链接答案。我现在也在描述相关的斯波克2句法糖语法。

最新更新