【问题标题】:Testing RxJava infinite interval测试 RxJava 无限区间
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多