2017-08-01 48 views
0

因此,在開始約我想要什麼才達到一點背景知識:如何通過Flowable提供單元測試的數據?

我有一個名爲getBusRoutesByQuery(query: String)DataManager類返回Flowable<List<Route>>功能。該功能通過給定查詢在本地和遠程存儲器中搜索公交路線。我正在使用zip來合併兩個Flowable,並將它們合併爲一個,但沒有重複。但例如,當用戶第一次使用應用程序時,他將不會在本地源中獲得任何數據,因此zip將不起作用。所以我找到了一個函數onErrorReturn,我在沒有數據返回時使用它。 onErrorReturn返回空列表而不是錯誤,所以遠程源將zip與空數據。現在,當我在測試Flowble.empty()中使用本地存儲中沒有數據的情況時,測試未通過。

測試假設

  1. 在本地存儲任何數據在遠程存儲
  2. 數據可用
  3. getBusRoutesByQuery(query: String)DataManager
  4. 數據調用時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,在本地存儲數據不可用,我怎麼可以測試它做。謝謝;)

回答

1

你的實現是錯誤的。 Zip將在每個流上結合1:1,請參閱文檔:http://reactivex.io/documentation/operators/zip.html。由於您的某個流是空的,因此無法壓縮,也沒有任何內容會被推送到下游。

而不是壓縮我建議合併和不同:localSource.mergeWith(networkSourceWithSave).distinct()

+0

謝謝,現在它的工作;) – Panczur