【发布时间】:2018-05-24 18:32:51
【问题描述】:
我有一个简单的视图,将货币显示为列表。应用程序每 1 秒从 Web 服务获取货币。所以我的 ViewModel 中有以下方法:
fun onViewAppeared() {
currenciesViewStateUpdates.onNext(CurrenciesViewState(true, null))
Flowable.interval(1, TimeUnit.SECONDS)
.flatMapSingle { _ -> currenciesService.calculateCurrencies(Currency("EUR", 10.0)) }
.doOnError { error -> Log.d("LOG", error.message) }
.observeOn(AndroidSchedulers.mainThread())
.subscribe { currencies ->
currenciesViewStateUpdates.onNext(CurrenciesViewState(false, currencies))
}
}
现在我需要对这种行为进行单元测试:
@Test
fun viewAppearedAndCurrenciesRequestSucceeded_currenciesDisplayed() {
val currencies = listOf(Currency("", 0.0))
Mockito.`when`(currenciesServiceMock.calculateCurrencies(anyCurrency())).thenReturn(Single.just(currencies))
viewModel.getViewStateUpdates().subscribe(testObserver)
viewModel.onViewAppeared()
testObserver.assertSubscribed()
testObserver.assertNoErrors()
testObserver.assertValueCount(2)
assertFalse(testObserver.values()[1].loading)
assertNotNull(testObserver.values()[1].currencies)
testObserver.values()[1].currencies?.let { assertTrue(it.isNotEmpty()) }
}
所有 RxScheduler 都设置为立即。问题:当 observable 完成订阅时,测试会永远等待,但它永远不会完成,因为它是无限间隔。如何测试?
【问题讨论】:
-
P.S.你可以使用内置扩展 whenever() 而不是丑陋的 `when`
标签: android unit-testing kotlin rx-java