Android: Как выполнить модульное тестирование Observable concatMap compose с mockK - PullRequest
0 голосов
/ 20 сентября 2019

Мне нужно протестировать Observable с помощью concatMap, а затем создать.

Я использую RxJava и библиотеку mockk.

Я пытался использовать два отдельных every оператора для насмешки результатов.Но когда я звоню сначала

every {
    remoteLocalInteractor.isServerConfigurationEmpty()
        .compose(schedulerProvider.ioToMainObservableScheduler())
} returns  Observable.just(true)

, а затем

every {
    remoteLocalInteractor.isServerConfigurationEmpty()
} returns  Observable.just(true)

interactor.isServerConfigurationEmpty() возвращает ObservableJust.Все в порядке

Но interactor.isServerConfigurationEmpty().compose() возвращает NPE, композитор нулевой

Case 1

И когда я пишу первый

every {
    interactor.isServerConfigurationEmpty().compose(...)
} returns Observable.just(true)

, а затем

every { 
    interactor.isServerConfigurationEmpty() 
} returns Observable.just(true)

interactor.isServerConfigurationEmpty().compose() возвращает ObservableJust.Хорошо.

Но interactor.isServerConfigurationEmpty() возвращает Observable(child of #1#3), и мне нужно иметь ObservableJust Объект

Case 2

Этомой тестовый класс

@RunWith(JUnit4::class)
class RemoteLocalPresenterTest : BaseTest() {

  @Before
  override fun setup() {
      super.setup()
      remoteLocalInteractor = spyk()
      remoteLocalPresenter = RemoteLocalPresenter(
          remoteLocalInteractor,
          schedulerProvider,
          compositeDisposable,
          remoteLocalConfigConverter
      )
      remoteLocalPresenter.onAttach(remoteLocalView)
  }

  @Test
  fun 
  testShouldSaveDefaultConfigurations_serverConfigurationsIsEmpty_onSuccess(){
      every {
          remoteLocalInteractor.isServerConfigurationEmpty()
      } returns  Observable.just(true)

      every {
          remoteLocalInteractor.isServerConfigurationEmpty()
              .compose(schedulerProvider.ioToMainObservableScheduler())
      } returns  Observable.just(true)

      remoteLocalPresenter.shouldSaveDefaultConfigurations(activity)
  }
}

И это мой тест для проверки

override fun shouldSaveDefaultConfigurations(activity: BaseActivity) {
        getView()?.showProgress()
        interactor?.let { interactor ->
            interactor.isServerConfigurationEmpty().concatMap { isEmpty ->
                if (isEmpty)
                    Observable.just(ClientTO())
                else
                    Observable.just(false)
            }.compose(schedulerProvider.ioToMainObservableScheduler())
                .subscribe({ res ->
                    when (res) {
                        is ClientTO -> {
                            getView()?.hideProgress()
                            ...
                            ...
                            ...
                        }
                        else -> {
                            getView()?.let {
                                ...
                                ...
                                ...
                            }
                        }
                    }
                }, { err ->
                    CommonUtil.handleErrors(err)
                })
        }
    }

1 Ответ

0 голосов
/ 23 сентября 2019

Я решил, высмеивая результат моего schedulerProvider.ioToMainObservableScheduler().

Основная проблема заключалась в работе с Schedulers.io() и AndroidSchedulers.mainThread().Тогда я нашел этот удивительный пост в среде. Исправление проблемы модульного теста RxJava Chain и Kotlin .

Итак, прежде чем мне нужно сделать наблюдаемый вызов, я делаю это.

every {
    schedulerProvider.ioToMainObservableScheduler<Scheduler>()
} answers {
    ObservableTransformer { upstream -> 
        upstream.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) 
    }
}

Итак, теперь мой тест выглядиткак:

@Test
fun testShouldSaveDefaultConfigurations_serverConfigurationsIsEmpty_onSuccess() {
    every {
        schedulerProvider.ioToMainObservableScheduler<Scheduler>()
    } answers {
        ObservableTransformer { upstream -> 
           upstream
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread()) 
        }
    }

    every {
        remoteLocalInteractor.isServerConfigurationEmpty()
    } returns Observable.just(true)

    remoteLocalPresenter.shouldSaveDefaultConfigurations(activity)

    verify(remoteLocalPresenter.getView())?.hideProgress()
}

Надеюсь, это кому-нибудь поможет.

...