我有这种方法从api
获取搜索结果public void fetchSearchResults(Observable<String> searchObservable) {
searchObservable
.filter(search -> !TextUtils.isEmpty(search))
.debounce(700, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(search -> getView().showLoader)
.switchMap(search -> apiService.fetchSearchResults(search)) //Api call is executed on an io scheduler
.subscribe(consumer, errorConsumer);
}
我为这个方法编写了这个JUnit测试:
@Test
public void fetchSearchResultsTest() {
TestScheduler testScheduler = new TestScheduler();
Observable<String> nameObservable = Observable.just("","FA")
.concatMap(search -> Observable.just(search).delay(100,
TimeUnit.MILLISECONDS, testScheduler));
testScheduler.advanceTimeBy(100, TimeUnit.MILLISECONDS);
verify(view, never()).showLoader();
testScheduler.advanceTimeBy(100, TimeUnit.MILLISECONDS);
verify(view, never()).showLoader();
}
但是在带有消息
的最后verify
语句上测试失败了
org.mockito.exceptions.verification.NeverWantedButInvoked
view.showLoader();
我尝试将TestScheduler
传递给debounce
运算符,并将默认计算调度程序设置为TestScheduler
到RxJavaPlugins
,但结果不会改变,测试仍然失败。
如果测试失败,那么这意味着debounce
运算符正在通过它发送事件,忽略在其参数中传递的超时。我不知道这是否正确,但据我所知。所以,我的问题是我如何修复此测试并控制来自debounce
运算符的事件,就像我使用TestSchedulers
处理源可观察对象一样?
答案 0 :(得分:1)
由于发出第二个项目时发生onCompleted()
,您的测试失败。文档说明debounce()
会在收到onCompleted()
后立即发出最终项目。
要使测试工作,请连接Observable.never()
,或在管道中添加更多项目。
以下是using debounce关于自动完成的文章。