Единичное тестирование 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) } 
Intereting Posts
Используя Kovenant от Kotlin, я продолжаю использовать повторяющийся код, используя Deferred Kotlin + Dagger2 @Named аннотация в использовании метода модуля Как получить имя файла без расширения в Kotlin Есть ли способ войти в PayPal с помощью htmlunit? Котлин «Смарт-литье невозможно, потому что к этому моменту собственность могла быть изменена» Статические методы расширения в Котлине kotlin.TypeCastException: null не может быть применено к ненулевому типу com.midsizemango.databasekotlin.Note Котлин, общее дополнение Kotlin – Как я могу получить доступ к моей новой функции расширения класса из другого файла Unity (C #) -> Kotlin <- Coroutines Как получить различную реализацию функции верхнего уровня в Unit и InstrumentTests для Android Параметр типа Ketlin reified не используется Котлин объединяет два изменяемых значения с возможностью смены имени Могу ли я обеспечить нулевую безопасность для типов платформ из Java API? Каков правильный способ работы с полями в Котлине?