TestScheduler没有使用RxJava

时间:2016-11-07 02:46:07

标签: java rx-java

我试图测试一个函数,在延迟后逐个调度流的元素,我能够使用Thread.sleep使我的测试工作。但是,当我使用TestScheduler.advanceTimeBy时,我无法获得任何结果。

查看代码:

public Observable<Object> getDelayedObjects(Observable<Observable<Object>> objectsStreams) {
    objectsStreams.concatMap(objectsStream ->
        objectsStream.repeat().concatMap(object ->
            Observable.just(object)
                      .delay(getDuration(object), TimeUnit.MILLISECONDS)));
}

测试代码:

TestScheduler testScheduler = new TestScheduler();
BehaviorSubject<Observable<Object>> objectStreamSubject = BehaviorSubject.create(objectsStream);

model.getDelayedObjects(objectStreamSubject)
        .observeOn(testScheduler)
        .subscribeOn(testScheduler)
        .subscribe(testSubscriber);

testScheduler.triggerActions();
//Thread.sleep(900) works with the default scheduler
testScheduler.advanceTimeBy(900, TimeUnit.MILLISECONDS);
testSubscriber.assertReceivedOnNext(objects);

更新

检查TestScheduler用法我发现通常会将调度程序传递给delay函数。因此,通过将调度程序作为方法getDelayedObjects的参数,然后提供给delay,我能够通过测试。但是,我仍然不明白为什么之前没有工作。

1 个答案:

答案 0 :(得分:2)

默认情况下,delay运算符使用computation scheduler执行基于时间的延迟。此信息可在方法的documentation中找到。在@SchedulerSupport注释中查找值,在本例中为io.reactivex:computation

出于测试目的,您必须使用TestScheduler替换计算Scheduler。为了能够替换,您必须使用delay Scheduler运算符来接收localhost:8080/#access_token=xxx&id_token=xxx