Pruebas unitarias Rxjava observables que tienen un retraso

Quiero poder probar un Observable que tiene una emisión retrasada, pero sin esperar el time de demora. ¿Hay alguna forma de hacer esto?

Actualmente estoy usando CountDownHatch para retrasar la afirmación, y eso funciona bien, pero aumenta el time de ejecución de la testing.

Ejemplo:

 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 es perfecto para esto. Tiene un método práctico advanceTimeBy(long, TimeUnit) que le permite controlar el time. Y Observable.delay tiene un método de sobrecarga que toma un Scheduler .

Así que solo use la Scheduler.computation() pnetworkingeterminada Scheduler.computation() en la function myObservable , y use TestScheduler para probar la unidad.

Pude encontrar una solución completa gracias a la respuesta de @ aaron-he.

Utiliza una combinación de TestScheduler para adelantar el time y también RxJavaPlugins para anular el planificador pnetworkingeterminado con testScheduler. Esto permitió probar la function myObservable() sin modificaciones o sin necesidad de pasar un 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) } 
  • Cómo contar el time de ejecución de lo observable
  • Utilice la unidad de Kotlin (o cualquier otro object) escriba en el layout de Android
  • Para una function de Kotlin utilizada como expresión, ¿hay una forma concisa de operar y devolver un valor?
  • ¿Por qué no puedo usar la interfaz como el tipo genérico en este transformador Rx?
  • ¿Hay alguna manera de cambiar mi método a la stream Observable que será una cadena de modificadores?
  • Espere hasta que dos observables emitan verdadero
  • Fusionar observables dependientes
  • Cómo crear el controller de respuesta genérica para el error y validar la respuesta utilizando retrofit, rxjava y dagger
  • Buscando con RxJava no funciona
  • RxJava Observable.create envolver suscripciones observables
  • Cómo escribir la testing adecuada para el repository de interfaz reactiva que devuelve Observable solo cuando hay algún evento, cómo simular el desencadenamiento de ese evento