Единичное тестирование Rxjava наблюдаемых, которые имеют задержку

Я хочу, чтобы иметь возможность тестировать Observable с задержкой излучения, но без ожидания времени задержки. Есть ли способ сделать это?

В настоящее время я использую CountDownHatch для задержки утверждения, и это работает нормально, но увеличивает время тестового запуска.

Пример:

 val myObservable: PublishSubject<Boolean> = PublishSubject.create<Boolean>() fun myObservable(): Observable<Boolean> = myObservable.delay(3, TimeUnit.SECONDS) @Test fun testMyObservable() { val testObservable = myObservable().test() myObservable.onNext(true) // val lock = CountDownLatch(1) // lock.await(3100, TimeUnit.MILLISECONDS) testObservable.assertValue(true) } 

TestScheduler идеально подходит для этого. Он имеет удобный метод advanceTimeBy(long, TimeUnit) позволяет вам контролировать время. И Observable.delay имеет метод перегрузки, который принимает Scheduler .

Поэтому просто используйте функцию Scheduler.computation() по myObservable функции myObservable и используйте TestScheduler для модульного тестирования.

Я смог придумать полное решение благодаря @ aaron – он ответил.

Он использует комбинацию TestScheduler для продвижения времени, а также RxJavaPlugins для переопределения планировщика по умолчанию с помощью testScheduler. Это позволило протестировать myObservable() без изменения или пройти в Scheduler .

 @Before fun setUp() = RxJavaPlugins.reset() @After fun tearDown() = RxJavaPlugins.reset() @Test fun testMyObservable() { val testScheduler = TestScheduler() RxJavaPlugins.setComputationSchedulerHandler { testScheduler } val testObservable = myObservable().test() myObservable.onNext(true) testScheduler.advanceTimeBy(2, TimeUnit.SECONDS) testObservable.assertEmpty() testScheduler.advanceTimeBy(2, TimeUnit.SECONDS) testObservable.assertValue(true) }