我有以下使用com.mongodb.reactivestreams.client.MongoClient
和Flowable
从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句法糖语法。