【发布时间】:2017-08-01 18:08:01
【问题描述】:
所以,在开始时,我想了解一下我想要达到的目标:
我在名为getBusRoutesByQuery(query: String) 的DataManager 类中有函数,它返回Flowable<List<Route>>。该功能通过给定查询在本地和远程存储中搜索公交路线。我正在使用zip 组合两个Flowables 并将它们合并为一个而不重复。但是例如,当用户第一次使用应用程序时,他不会在本地源中有任何数据,因此zip 将不起作用。所以我找到了一个函数onErrorReturn,我在没有数据返回的时候使用它。 onErrorReturn 返回空列表而不是错误,因此远程源将 zip 带有空数据。现在当我在测试中使用Flowble.empty() 来模拟本地存储中没有数据的情况时,测试没有通过。
测试假设:
- 本地存储中没有数据
- 远程存储中的可用数据
-
从
DataManager调用getBusRoutesByQuery(query: String) - 数据被检索
现在它在代码中的样子:
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