【问题标题】:Unit Testing RxJava onComplete, onNext and onError单元测试 RxJava onComplete、onNext 和 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)
        }
    })

【问题讨论】:

    标签: java android unit-testing kotlin rx-java


    【解决方案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()
      }
      

      【讨论】:

        猜你喜欢
        • 2018-02-20
        • 2018-09-09
        • 2021-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-05
        相关资源
        最近更新 更多