android - 单元测试时不调用 Rxjava 2 on error
问题描述
单元测试时不会调用 Rxjava 2 on error。我正在使用 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)
}
解决方案
似乎您也在测试中异步运行代码。
您必须同步之前使用的调度程序。
@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)
}
推荐阅读
- python - Python 多处理池类不起作用
- kotlin - 制作我自己的按钮类
- java - jdk 版本 8 静默安装不更新路径环境变量
- mysql - docker mysql initdb 脚本无法连接到数据库
- java - 正则表达式删除井号和双逗号java csv
- python - 即使使用 xml_attribs = True,属性也不会出现在 xml2dict 解析输出中
- python - 生成随机长度的随机列表(有点)
- swift - 如何在 Core Graphics 中的两个任意点之间绘制一个完美的半圆?
- javascript - 如何在 iframe 中包含的外部页面上显示隐藏的 div
- node.js - 引用当前目录之外的目录。“模块映射中不存在模块。” 在 node/react-native