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

时间:2017-10-06 19:02:38

标签: 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(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处理源可观察对象一样?

1 个答案:

答案 0 :(得分:1)

由于发出第二个项目时发生onCompleted(),您的测试失败。文档说明debounce()会在收到onCompleted()后立即发出最终项目。

要使测试工作,请连接Observable.never(),或在管道中添加更多项目。

以下是using debounce关于自动完成的文章。