だから、で私はachiveしたいものについて少しコンテキストを開始します。ユニットテストのためにFlowableでデータを送信しない方法は?
私はFlowable<List<Route>>
を返しgetBusRoutesByQuery(query: String)
という名前DataManager
クラスの機能を持っています。この機能は、指定されたクエリによるバス経路のローカルストレージとリモートストレージを検索します。 zip
を使用して、2つのFlowableを結合し、それらを重複なしで1つにマージします。しかし、例えばユーザーが初めてアプリケーションを使用するときには、ローカルソースにデータがないので、zip
は機能しません。だから私は関数onErrorReturn
を見つけたと私はそれが戻ってくるデータがないときにそれを使用しています。 onErrorReturn
は、エラーではなく空のリストを返します。したがって、リモートソースは空のデータを持つzip
になります。そして今、私がテストでFlowble.empty()
を使用して、ローカルストレージにデータがない状況を想定すると、テストは合格しません。
テスト仮定:
DataManager
- データが今どのよう
をretrivenれるからリモートストレージに利用可能なローカルストレージにデータ
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
、そしてどのように私はそれをテストすることができて何ができますか。ありがとう;)
おかげで、今では働いているが;) – Panczur