Rx Java test `repeat` на наблюдаемом create end l oop на тестах - PullRequest
1 голос
/ 03 марта 2020

Я настроил ViewModel на бесконечный повтор вызова API следующим образом:

useCase.fireAPICall(params)
   .subscribeOn(Schedulers.io())
   .observeOn(AndroidSchedulers.mainThread())
   .repeat()
   .delay(1, TimeUnit.SECONDS)
   .subscribe(::onSuccess, ::onFailed)

В своих модульных тестах я пытаюсь смоделировать вызов API и проверить, действительно ли LiveData внутри ViewModel (обновляется в методе ::OnSuccess) обновляется соответствующим образом.

Работающий модульный тест, который проверяет сбой:

val error = Throwable("")
// Arrange
Mockito.`when`(repo.apiCall(params))
   .thenReturn(Single.error(error))
// Act
viewModel.init()
// Verify
Mockito.verify(postDetailsViewStateObserver)
   .onChanged(Error(error))

** Не работает: ** f Вместо этого я пытаюсь смоделировать действительный ответ от этого API вызов с:

// Arrange
Mockito.doReturn(Single.just(Success(result, list)))
   .`when`(repo).apiCall(params)

Затем ViewModel repeat() генерирует бесконечный l oop, который блокирует мой модульный тест, не завершая его никогда.

Вопрос: как мы можем проверить repeat() ситуацию, проверив только первое, что испускается в этой наблюдаемой?

1 Ответ

1 голос
/ 04 марта 2020

Вам нужно предоставить планировщик для delay, чтобы использовать время теста, например:

val testScheduler = TestScheduler()
RxJavaPlugins.setComputationSchedulerHandler { testScheduler }

И после этого вызова testScheduler.advanceTimeBy(1, TimeUnit.SECONDS), чтобы вы двинулись вперед на одну секунду. Чтобы это сработало, вы, вероятно, также должны изменить порядок, delay должен быть до repeat.

Вам необходимо setComputationSchedulerHandler, так как delay по умолчанию использует этот планировщик.

...