单元测试RxJava onComplete,onNext和onError

时间:2019-08-16 06:49:20

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

我无法找到一种方法来对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)
        }
    })

2 个答案:

答案 0 :(得分:0)

我不确定模拟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()
}

答案 1 :(得分:0)

首先,您需要模拟const rows = `100|Description 1|a| 101|Description 2|a| 102|Description 3|b|`.split("\n") let list = {} rows.forEach(row => { (([ProductId, Description, subCat]) => (list[ProductId] = { Description, subCat }))(row.split("|")) }) console.log(list)实例并定义myApi的响应。

您可以根据响应使用myApi.method()声明Rx链的不同情况。

TestObserver

您还可以测试整个流程,并查看调用了@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()) } 方法。为此,您需要模拟viewmyApi。假设代码是演示者或视图模型中方法的一部分。

view