单元测试 RxJava onComplete、onNext 和 onError

Posted

技术标签:

【中文标题】单元测试 RxJava onComplete、onNext 和 onError【英文标题】:Unit Testing RxJava onComplete, onNext and onError 【发布时间】:2019-12-22 12:13:21 【问题描述】:

我无法找到对 android 中 RxJava 的 onComplete、onNext 和 onError 案例进行单元测试的方法。

TestSubscriber 似乎解决了这个问题,但是作为 RXJava 的新手,我仍然不知道如何去做。

MyApi.method()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(object : Observer<SettleCodeResponse> 
        override fun onCompleted() 
        

        override fun onError(e: Throwable) 
            view.hideProgress()
            Logger.logError(TAG, e.message)
        

        override fun onNext(response: SettleCodeResponse) 
            view.hideProgress()
            process(response)
        
    )

【问题讨论】:

【参考方案1】:

我不确定 Mocking static 类,但你可以试试这种方式。

首先你必须模拟MyApi

在任何类别中

class Foo(private val view: SomeView, private val myApi: MyApi) 
    fun doSomething() 
        myApi.method().subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(object : Observer<SettleCodeResponse> 
                override fun onCompleted() 

                override fun onError(e: Throwable) 
                    view.hideProgress()
                    Logger.logError(TAG, e.message)
                

                override fun onNext(response: SettleCodeResponse) 
                    view.hideProgress()
                    process(response)
                
            )
    

在你的测试中

lateinit var myApi: MyApi
lateinit var view: SomeView
lateinit var foo: Foo

@Before
fun setup() 
    RxAndroidPlugins.setInitMainThreadSchedulerHandler( Schedulers.trampoline() )
    MockitoAnnotations.initMocks(this)
    myApi = mock(MyApi:class.java)
    view = mock(SomeView::class.java)
    foo = Foo(view, myApi)


@Test
fun testOnNext() 
    given(myApi.method()).willReturn(SettleCodeResponse())
    foo.doSomething()
    verify(view).hideProgress()

【讨论】:

【参考方案2】:

首先你需要模拟你的myApi实例并定义myApi.method()的响应。

您可以使用TestObserver 根据响应断言您的 Rx 链的不同场景。

@Test
fun test() 
    //mock the response of the method
    when(myApi.method()).thenReturn(Observable.just(someSettleCodeResponse())

    //create a test observer and subscribe
    val observable: Observable<SettleCodeResponse> = myApi.method()
    val observer: TestObserver<SettleCodeResponse> = TestObserver()
    observable.subscribe(observer)

    //test the observer behaviour
    observer.assertComplete()
            .assertNoErrors()
            .assertValue(someSettleCodeResponse())

您还可以测试整个流程并查看是否调用了 view 方法。为此,您需要模拟您的myApiview。假设代码是演示者或视图模型中方法的一部分。

@Test
fun anotherTest() 
    //mock the response of the method
    when(myApi.method()).thenReturn(Observable.just(someSettleCodeResponse())

    //call the method you want to test
    presenter.method()

    //test that the view mock methods are called
    verify(view).hideProgress()

【讨论】:

以上是关于单元测试 RxJava onComplete、onNext 和 onError的主要内容,如果未能解决你的问题,请参考以下文章

RXJAVA-Maybe

RXJAVA-Maybe

用于测试 rxjava 的书面单元测试,但不确定我的单元测试是不是正在测试所有内容

如何在 RxJava2 中链接两个 Completable

RxJava 和改造的单元测试

使用 Completable.timer 对 RxJava 进行单元测试