为包含RxJava的throttleLast运算符的方法编写单元测试

时间:2017-07-11 12:59:32

标签: android rx-java rx-java2

我有一种我想测试的方法看起来像这样:

 private Disposable getStuff(){
    return Observable
            .combineLatest(
                    repoOne.getStuff(),
                    repoTwo.getOtherStuff(),
                    session.getSomethingElse(),
                    session.getOtherSomethingElse(),
                    (a, b, c, d) -> new Stuff.Builder()
                            .stuff(a)
                            .stuffB(b)
                            .stuffC(c)
                            .stuffD(d)
                            .build())
            .throttleLast(500, TimeUnit.MILLISECONDS)
            .subscribeOn(mSchedulerProvider.io())
            .observeOn(mSchedulerProvider.ui())
            .subscribe(this::populateStuff, this::showError);
}

我试图测试这种方法,但它没有通过throttleLast。我主要通过应用TestScheduler来尝试它,但没有随时随地使用它。例如,我尝试过:

<...>
    .throttleLast(500, TimeUnit.MILLISECONDS,mTestScheduler)
<...>

然后当我打电话给方法时,我提前了:

    mCompositeDisposable.add(getStuff());
    mTestScheduler.advanceTimeTo(0, TimeUnit.MILLISECONDS);
    mTestScheduler.advanceTimeTo(505, TimeUnit.MILLISECONDS);

但这没有任何作用,即populateStuffshowError仍未被调用。我可能错误地使用了TestScheduler,有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我仍然不确定为什么这不起作用,所以任何解释肯定会有所帮助。但是,作为修复,我已将throttleLast替换为sample

.sample(500, TimeUnit.MILLISECONDS, true)

从我的理解throttleLast调用sample并将emitLast参数设置为false。从逻辑上讲,我确实想要发射最后一个项目,所以对我而言,改变是有益的。但是,并不确定链在单元测试中的行为如何使用TestScheduler来跳过任何发射。