Java 单元测试中忽略超时的去抖动

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

我有这个方法从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);
}
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类在哪里/是什么的问题?