在单元测试中去抖忽略超时

Debounce ignoring timeout in unit tests

我有这个方法可以从 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 运算符并将默认计算调度程序设置为 TestSchedulerRxJavaPlugins 但结果没有改变,测试仍然失败。

如果测试失败,则意味着 debounce 运算符正在通过它发送事件,而忽略了参数中传递的超时。我不知道这是否正确,但据我所知。所以,我的问题是如何修复此测试并控制来自 debounce 运算符的事件,就像我使用 TestSchedulers?

处理可观察源一样

您的测试失败,因为在发出第二个项目时发生 onCompleted()。文档说 debounce() 将在收到 onCompleted().

后立即发布最终项目

要使您的测试正常进行,请连接一个 Observable.never(),或将更多项目添加到管道中。

这里有一篇关于 using debounce 自动完成的文章。