单元测试 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
方法。为此,您需要模拟您的myApi
和view
。假设代码是演示者或视图模型中方法的一部分。
@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的主要内容,如果未能解决你的问题,请参考以下文章