Intereting Posts
Функция расширения Android Studio 3.0 kotlin 'Unresolved reference' Почему Mockito не может высмеивать общий тип параметра с типом номера в Kotlin? Kotlin Упрощение булевых выражений Модернизация 2 Многостраничные запросы Преобразование устаревших методов из Java в Kotlin Android проверяет, соответствует ли текстовый ввод (время) формату Подстановочные знаки, общие для Kotlin для параметра Включение безопасности глобальной безопасности Spring Security нарушает инъекцию зависимостей (с Kotlin) Автоматическое обновление версии библиотеки для проектов Gradle в настоящее время не поддерживается. Обновите файл build.gradle вручную. locationManager.getBestProvider возвращает значение null для API 15 (API <23) Как создать экземпляр анонимного интерфейса в Котлине? Всплывающее диалоговое окно завершения работы Kotlin после ввода «объекта». Как реорганизовать представление, чтобы разрешить фильтрацию элементов, привязанных к наблюдаемомуArrayList, внутри приложения tornadofx Как читать текстовый файл из ресурсов в Котлин? Anko DSL пересматривает странное поведение при добавлении элементов

Единичное тестирование 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) }