android - Android:如何使用 mockK 对 Observable concatMap 组合进行单元测试
问题描述
我需要使用 concatMap 对 Observable 进行单元测试,然后进行组合。
我正在使用 RxJava 和 mockk 库。
我一直在尝试使用两个单独every
的语句来模拟结果。但是当我第一次打电话时
every {
remoteLocalInteractor.isServerConfigurationEmpty()
.compose(schedulerProvider.ioToMainObservableScheduler())
} returns Observable.just(true)
进而
every {
remoteLocalInteractor.isServerConfigurationEmpty()
} returns Observable.just(true)
interactor.isServerConfigurationEmpty()
返回ObservableJust
。好的
但interactor.isServerConfigurationEmpty().compose()
返回NPE
,作曲家为空
当我先写
every {
interactor.isServerConfigurationEmpty().compose(...)
} returns Observable.just(true)
进而
every {
interactor.isServerConfigurationEmpty()
} returns Observable.just(true)
interactor.isServerConfigurationEmpty().compose()
返回ObservableJust
。好的。
但是interactor.isServerConfigurationEmpty()
返回Observable(child of #1#3)
,我需要有一个ObservableJust
对象
这是我的测试课
@RunWith(JUnit4::class)
class RemoteLocalPresenterTest : BaseTest() {
@Before
override fun setup() {
super.setup()
remoteLocalInteractor = spyk()
remoteLocalPresenter = RemoteLocalPresenter(
remoteLocalInteractor,
schedulerProvider,
compositeDisposable,
remoteLocalConfigConverter
)
remoteLocalPresenter.onAttach(remoteLocalView)
}
@Test
fun
testShouldSaveDefaultConfigurations_serverConfigurationsIsEmpty_onSuccess(){
every {
remoteLocalInteractor.isServerConfigurationEmpty()
} returns Observable.just(true)
every {
remoteLocalInteractor.isServerConfigurationEmpty()
.compose(schedulerProvider.ioToMainObservableScheduler())
} returns Observable.just(true)
remoteLocalPresenter.shouldSaveDefaultConfigurations(activity)
}
}
这是我要测试的功能
override fun shouldSaveDefaultConfigurations(activity: BaseActivity) {
getView()?.showProgress()
interactor?.let { interactor ->
interactor.isServerConfigurationEmpty().concatMap { isEmpty ->
if (isEmpty)
Observable.just(ClientTO())
else
Observable.just(false)
}.compose(schedulerProvider.ioToMainObservableScheduler())
.subscribe({ res ->
when (res) {
is ClientTO -> {
getView()?.hideProgress()
...
...
...
}
else -> {
getView()?.let {
...
...
...
}
}
}
}, { err ->
CommonUtil.handleErrors(err)
})
}
}
解决方案
我通过模拟我的schedulerProvider.ioToMainObservableScheduler()
.
主要问题是使用Schedulers.io()
and AndroidSchedulers.mainThread()
。然后我在媒体上发现了这个惊人的帖子。修复 RxJava Chain 和 Kotlin 的单元测试问题。
所以在我需要进行可观察的调用之前,我会这样做。
every {
schedulerProvider.ioToMainObservableScheduler<Scheduler>()
} answers {
ObservableTransformer { upstream ->
upstream.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
}
}
所以,现在 mi test 看起来像:
@Test
fun testShouldSaveDefaultConfigurations_serverConfigurationsIsEmpty_onSuccess() {
every {
schedulerProvider.ioToMainObservableScheduler<Scheduler>()
} answers {
ObservableTransformer { upstream ->
upstream
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
}
}
every {
remoteLocalInteractor.isServerConfigurationEmpty()
} returns Observable.just(true)
remoteLocalPresenter.shouldSaveDefaultConfigurations(activity)
verify(remoteLocalPresenter.getView())?.hideProgress()
}
希望这可以帮助某人。
推荐阅读
- java - 如何使用 retrofit2 和 koin 2.0 更改基本 URL
- sql-server-2012 - 格式化函数在 SQL Server 2012 中有效吗?
- cmd - forfiles 删除文件大小小于 x 的文件
- sql - 从表中获取数据的困难
- python - 如何使用 AWS Lambda 在 AWS S3 中写入、更新和保存 CSV
- mysql - docker-compose 中的 MariaDB 卷清除数据
- c# - UiPath:如何将默认值设置为 String [] 变量
- vb.net - 在 vb.NET 中加入表
- r - 如何使用 x 和 y 列作为标签将 df (x,y,z) 转换为表格,并使用包括 z 的函数填充单元格?
- ruby-on-rails - 如何让 Rails form_for 指向不同的控制器