我试图测试一个函数,在延迟后逐个调度流的元素,我能够使用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
,我能够通过测试。但是,我仍然不明白为什么之前没有工作。
答案 0 :(得分:2)
默认情况下,delay
运算符使用computation scheduler执行基于时间的延迟。此信息可在方法的documentation中找到。在@SchedulerSupport
注释中查找值,在本例中为io.reactivex:computation
。
出于测试目的,您必须使用TestScheduler
替换计算Scheduler。为了能够替换,您必须使用delay
Scheduler
运算符来接收localhost:8080/#access_token=xxx&id_token=xxx
。