我正在尝试测试一个函数,其中流的元素在延迟后逐个分派,我能够使用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
方法中提供调度器参数来让测试通过。但是,我仍然不知道为什么之前不起作用。