Java 单元测试中忽略超时的去抖动
我有这个方法从api获取搜索结果Java 单元测试中忽略超时的去抖动,java,android,unit-testing,junit,rx-java2,Java,Android,Unit Testing,Junit,Rx Java2,我有这个方法从api获取搜索结果 public void fetchSearchResults(Observable<String> searchObservable) { searchObservable .filter(search -> !TextUtils.isEmpty(search)) .debounce(700, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedul
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);
}
public void fetchSearchResults(可观察的searchObservable){
可观察的
.filter(搜索->!TextUtils.isEmpty(搜索))
.debounce(700,时间单位毫秒)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(搜索->获取视图().showLoader)
.switchMap(search->apiService.fetchSearchResults(search))//在io调度程序上执行Api调用
.订阅(消费者、错误消费者);
}
我为这个方法编写了这个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();
}
@测试
public void fetchSearchResultsTest(){
TestScheduler TestScheduler=新的TestScheduler();
可观测名称可观测=可观测。仅(“,“FA”)
.concatMap(搜索->可观察.just(搜索).延迟(100,
TimeUnit.ms,testScheduler));
testScheduler.advanceTimeBy(100,时间单位为毫秒);
验证(查看,从不()).showLoader();
testScheduler.advanceTimeBy(100,时间单位为毫秒);
验证(查看,从不()).showLoader();
}
但在最后一个带有消息的verify
语句中,测试失败
org.mockito.exceptions.verification.NeverWantedButInvoked
view.showLoader()
我尝试将TestScheduler
传递给debounce
操作符,并通过RxJavaPlugins
将默认计算调度器设置为TestScheduler
,但结果没有改变,测试仍然失败
如果测试失败,那么这意味着
debounce
操作符正在通过它发送事件,忽略了在其参数中传递的超时。我不知道这是否正确,但这是我所能理解的。因此,我的问题是如何修复此测试并控制来自debounce
操作符的事件,就像我使用TestSchedulers
观察到的源所做的那样?您的测试失败,因为在发出第二项时发生了onCompleted()
。文档中说,debounce()
将在收到onCompleted()
后立即发布最终项目
要使测试正常工作,请连接一个可观察的.never()
,或向管道中添加更多项
这是一篇关于自动完成的文章。你是对的,在源observable中添加第三个元素解决了TestScheduler类在哪里/是什么的问题?