因此,在開始約我想要什麼才達到一點背景知識:如何通過Flowable提供單元測試的數據?
我有一個名爲getBusRoutesByQuery(query: String)
DataManager
類返回Flowable<List<Route>>
功能。該功能通過給定查詢在本地和遠程存儲器中搜索公交路線。我正在使用zip
來合併兩個Flowable,並將它們合併爲一個,但沒有重複。但例如,當用戶第一次使用應用程序時,他將不會在本地源中獲得任何數據,因此zip
將不起作用。所以我找到了一個函數onErrorReturn
,我在沒有數據返回時使用它。 onErrorReturn
返回空列表而不是錯誤,所以遠程源將zip
與空數據。現在,當我在測試Flowble.empty()
中使用本地存儲中沒有數據的情況時,測試未通過。
測試假設:
- 在本地存儲任何數據在遠程存儲
- 數據可用
getBusRoutesByQuery(query: String)
從DataManager
- 數據調用時retriven
現在怎麼它看起來在代碼:
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
,在本地存儲數據不可用,我怎麼可以測試它做。謝謝;)
謝謝,現在它的工作;) – Panczur