【问题标题】:Unit Testing RxJava Flowable using spock使用 spock 对 RxJava Flowable 进行单元测试
【发布时间】:2020-12-22 14:20:51
【问题描述】:

我有下面的 sn-p 用于使用 com.mongodb.reactivestreams.client.MongoClientFlowable 从 MongoDB 获取数据

sn-p 是这样的:

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

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

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

但是以某种方式执行此操作时,测试会继续运行。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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


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

      【讨论】:

        猜你喜欢
        • 2020-03-07
        • 1970-01-01
        • 2017-09-19
        • 2021-06-16
        • 1970-01-01
        • 1970-01-01
        • 2014-09-30
        • 2017-02-05
        • 1970-01-01
        相关资源
        最近更新 更多