首页 > 解决方案 > 单元测试时不调用 Rxjava 2 on error

问题描述

单元测试时不会调用 Rxjava 2 on error。我正在使用 kotlin 和 rxJava 2 。

方法

  @SuppressLint("CheckResult")
    override fun fetchFilms() {
        view.showLoader(true)
        disposable = getRetrofitInstance(false).create(API::class.java)
                .fetchFilms()
                .subscribeOn(io)
                .observeOn(main)
                .subscribeWith(object : DisposableObserver<Response>() {
                    override fun onComplete() {
                    }

                    override fun onNext(t: Response) {
                        println(t)
                        view.setAdapter(t?.results as List<ResultsItem>)
                        view.showLoader(false)
                    }

                    override fun onError(e: Throwable) {
                        e.printStackTrace()
                        view.showLoader(false)
                        view.showError(e.message.toString())                    }

                })


    }

测试

@Test
    fun  fetchInvalidDataShouldThrowError(){

        `when`(api.fetchFilms()).thenReturn(Observable.error(IOException()))
   filmsPresenter.fetchFilms()
        val subscriber = TestSubscriber<Response>()

        subscriber.awaitTerminalEvent(5,TimeUnit.SECONDS)

        verify(filmsView, times(1)).showLoader(true)
        verify(filmsView).showError("t")
        verify(filmsView).showLoader(false)


    }

标签: androidkotlinjunit

解决方案


似乎您也在测试中异步运行代码。

您必须同步之前使用的调度程序。

@Before
fun setupSchedulers() {
    RxAndroidPlugins.setMainThreadSchedulerHandler { Schedulers.trampoline() }
    RxJavaPlugins.setIoSchedulerHandler { Schedulers.trampoline() }
}

@Test
fun  fetchInvalidDataShouldThrowError() {
    `when`(api.fetchFilms()).thenReturn(Observable.error(IOException("t")))
    filmsPresenter.fetchFilms()

    verify(filmsView).showLoader(true)
    verify(filmsView).showError("t")
    verify(filmsView).showLoader(false)
}

推荐阅读