【问题标题】:How to emmit no data by Flowable for unit tests?如何通过 Flowable 不发送任何数据进行单元测试?
【发布时间】:2017-08-01 18:08:01
【问题描述】:

所以,在开始时,我想了解一下我想要达到的目标:

我在名为getBusRoutesByQuery(query: String)DataManager 类中有函数,它返回Flowable<List<Route>>。该功能通过给定查询在本地和远程存储中搜索公交路线。我正在使用zip 组合两个Flowables 并将它们合并为一个而不重复。但是例如,当用户第一次使用应用程序时,他不会在本地源中有任何数据,因此zip 将不起作用。所以我找到了一个函数onErrorReturn,我在没有数据返回的时候使用它。 onErrorReturn 返回空列表而不是错误,因此远程源将 zip 带有空数据。现在当我在测试中使用Flowble.empty() 来模拟本地存储中没有数据的情况时,测试没有通过。

测试假设

  1. 本地存储中没有数据
  2. 远程存储中的可用数据
  3. DataManager 调用getBusRoutesByQuery(query: String)
  4. 数据被检索

现在它在代码中的样子:

override fun getBusRoutesByQuery(query: String): Flowable<List<Route>> {
    val networkSourceWithSave: Flowable<List<Route>> = remoteBusDataManager
            .getBusRoutesByQuery(query)
            .doOnNext { localBusDataManager.insertBusRoutes(it) }
            .onErrorReturn { listOf() }
    val localSource: Flowable<List<Route>> = localBusDataManager
            .getBusRoutesByQuery(query)
            .onErrorReturn { listOf() }

    return Flowable.zip(localSource,
                        networkSourceWithSave,
                        BiFunction { local, remote -> mergeTwoListsWithoutDuplicates(local, remote) })
}

和测试:

@Test
fun getRoutesByQueryWhenLocalSourceIsNotAvailable() {
    `when`(localBusDataManager.getBusRoutesByQuery(QUERY)).thenReturn(Flowable.empty())
    `when`(remoteBusDataManager.getBusRoutesByQuery(QUERY)).thenReturn(Flowable.just(ROUTES))

    busDataManager.getBusRoutesByQuery(QUERY).subscribe(testSubscriber)

    testSubscriber.assertValue(ROUTES)
}

那么请告诉我,当本地存储数据不可用时,我可以用zip 做什么以及如何测试它。谢谢;)

【问题讨论】:

    标签: android unit-testing kotlin rx-java


    【解决方案1】:

    你的实现是错误的。 Zip 将在每个流上 1:1 组合,请参阅文档:http://reactivex.io/documentation/operators/zip.html。由于您的其中一个流是空的,因此没有任何内容可压缩,也不会被推送到下游。

    我建议不要压缩,而是合并和区分:localSource.mergeWith(networkSourceWithSave).distinct()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多