我有一个简单的视图,将货币显示为列表。应用程序每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()) }
}
所有RxSchedulers立即设置。问题:当可观察完成订阅时,测试等待永远,但它永远不会完成因为它是无限间隔。我该怎么测试呢?
答案 0 :(得分:0)
您将无法按照自己的方式运行测试。
Schedulers.immediate()
,因为您可能会陷入僵局。interval()
,timeout()
等)对显式调度程序进行操作,通常是您注入的调度程序。