【发布时间】:2019-01-14 12:24:28
【问题描述】:
我在 ViewModel 中有一个重复的 observable,如下所示:
class MainViewModel @Inject constructor(private val ratesUseCase: RatesUseCase) : ViewModel() {
private var disposable: Disposable? = null
private val resultLiveData = MutableLiveData<Resource<Map<String, Double>>>()
fun result() = resultLiveData
fun getRates(base: String) {
disposable = Observable
.interval(1, TimeUnit.SECONDS)
.flatMap { ratesUseCase.execute(base) }
.doOnSubscribe { publishResult(Resource.loading(mapOf())) }
.subscribe(
{
publishResult(Resource.success(values))
},
{
publishResult(Resource.error(it.localizedMessage, mapOf()))
}
)
}
}
我想测试 getRates 函数。它总是返回 LOADING 状态 这里缺少什么?
测试用例:
@Test
fun executeSuccess() {
val base = "CANARY"
whenever(currencyRepository.getRates(base))
.thenReturn(Observable.just(map))
viewModel.result().observeForever(observer)
viewModel.getRates(base)
verify(observer).onChanged(Resource.success(map))
}
【问题讨论】:
-
您是否覆盖了运行 Interval 的调度程序?
-
是的!像这样
subscribeOn(Schedulers.trampoline()).observeOn(Schedulers.trampoline()) -
嗯,默认情况下,interval 在计算线程上运行。您应该能够使用 RxJavaPlugins API 为测试设置新的调度程序。使用 setInitComputationSchedulerHandler 将计算调度程序上运行的所有内容路由到 trampoline() 调度程序。
-
现在我已经注射了它们。间隔现在在
Schedulers.trampoline()Observable .interval(1,TimeUnit.SECONDS).compose(appSchedulers.observableTransformer())上运行,但仍然给出相同的结果 -
哦,我明白了。您是否尝试调试 onNext 和 onComplete 以查看它们是否真正按顺序运行?这很奇怪。另外,你也在运行 InstantTaskExecutorRule,对吧?
标签: android unit-testing rx-java2 rx-android