单元测试时未调用Rxjava 2出错

问题描述 投票:0回答:3

单元测试时未调用Rxjava 2出错。我正在使用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)


    }
android kotlin junit
3个回答
0
投票

你实际上在这里创建了两个API

每次在演示者上调用fetchFilms()时都会创建一个新的API。你不能用这种方式嘲笑API

最好的猜测是将API对象作为方法参数传递给演示者中的fetchFilms()。这样你就可以决定提供真正的API或模拟的


1
投票

看起来你也在测试中运行你的代码异常。

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

@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)
}

0
投票

我已将repo传递给Presenter以获得相同的实例API。

这是我必须做的一些改变

class RepoTest(val api : API) {
    fun filmm() : Observable<Response> {
        return api.fetchFilms()
    }
}

主持人

class FlimsPresenter(private val view: GetFlimsContract.View,  repo: RepoTest) : GetFlimsContract.Presenter

方法

 override fun fetchFilms() {
        view.showLoader(true)
        disposable = repot.filmm()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(object : DisposableObserver<Response>() {
                    override fun onComplete() {
                    }

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

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

                })


    }

最后测试

class TestSample {
    @Mock
    private lateinit var filmsPresenter: GetFlimsContract.Presenter


    @Mock
    private lateinit var filmsView: GetFlimsContract.View


    private lateinit var api: API
    @Mock
    private lateinit var disposable: Disposable
    @Mock
    lateinit var repoTest: RepoTest

    @Before
    fun setup() {
        RxAndroidPlugins.setMainThreadSchedulerHandler { scheduler -> Schedulers.trampoline() }
        RxAndroidPlugins.setInitMainThreadSchedulerHandler { scheduler -> Schedulers.trampoline() }
        RxJavaPlugins.setIoSchedulerHandler { t -> Schedulers.trampoline() }
        MockitoAnnotations.initMocks(this)

        repoTest = Mockito.mock(RepoTest::class.java)

        filmsView = Mockito.mock(GetFlimsContract.View ::class.java)

        filmsPresenter = FlimsPresenter(filmsView,repoTest )
    }


    @Test
    fun `should lod item into views`() {

        Mockito.`when`(repoTest.filmm()).thenReturn(Observable.just(Response("","",7, listOf(ResultsItem()))))
        filmsPresenter.fetchFilms()

        Mockito.verify(filmsView).showLoader(true)
        Mockito.verify(filmsView).setAdapter(anyList())
        Mockito.verify(filmsView).showLoader(false)
    }


    @Test
    fun `should show error if network call fails`(){

        Mockito.`when`(repoTest.filmm()).thenReturn(Observable.error(Exception("t")))
        filmsPresenter.fetchFilms()
        Mockito.verify(filmsView).showLoader(true)
        Mockito.verify(filmsView).showError("t")
        Mockito.verify(filmsView).showLoader(false)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.