使用 spock 对 RxJava Flowable 进行单元测试

时间:2020-12-22 14:20:51

标签: unit-testing rx-java rx-java2 spock reactive-streams

我有以下代码片段,用于使用 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 对其进行单元测试的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

除了 Leonard 的想法外,您可能还想考虑实现一个特殊的 ThisResponse implements IDefaultResponse,它始终为每个模拟方法调用返回模拟实例,并为您的流畅 API 类使用 Mock(defaultResponse: ThisResponse.INSTANCE)( es)。只要测试中使用的 fluent API 方法应该返回 this 或至少另一个给定类型的对象,这就会很好地工作。只有在返回另一种类型的地方,您才需要存根。

查看 this answer 了解更多详情。只要您用一点 MCVE 更新您的问题,如果您在使用该解决方案时遇到任何问题,也可以提出后续问题。