Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 测试RxJava无限区间_Android_Unit Testing_Kotlin_Rx Java - Fatal编程技术网

Android 测试RxJava无限区间

Android 测试RxJava无限区间,android,unit-testing,kotlin,rx-java,Android,Unit Testing,Kotlin,Rx Java,我有一个简单的视图,将货币显示为列表。应用程序每1秒从web服务获取一次货币。因此,我在ViewModel中有以下方法: fun onViewAppeared() { currenciesViewStateUpdates.onNext(CurrenciesViewState(true, null)) Flowable.interval(1, TimeUnit.SECONDS) .flatMapSingle { _ -> currenciesService.calcu

我有一个简单的视图,将货币显示为列表。应用程序每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完成订阅时,测试将永远等待,但它永远不会完成,因为它是无限间隔的。我如何测试它?

您将无法按照自己的方式运行测试

  • 将调度程序设置为类参数,以便在测试和生产过程中以适当的方式注入它们
  • 使用测试调度程序而不是
    schedulers.immediate()
    ,因为您可能会陷入死锁
  • 始终让您的定时操作(
    interval()
    timeout()
    ,等等)在显式调度程序上运行,通常是您注入的调度程序

  • 请注意,不要使用丑陋的'when',您可以随时使用内置扩展()