Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save simplekjl/7c6512f223ddfbbf640973e993b92ed1 to your computer and use it in GitHub Desktop.
Save simplekjl/7c6512f223ddfbbf640973e993b92ed1 to your computer and use it in GitHub Desktop.
RxJava Immediate Scheduler Test Rule
/**
* Replaces the default RxJava schedulers with a synchronous one.
*/
class RxImmediateSchedulerRule : TestRule {
private val immediateScheduler = object : Scheduler() {
@NonNull
override fun scheduleDirect(@NonNull run: Runnable, delay: Long, @NonNull unit: TimeUnit): Disposable {
// Hack to prevent stack overflows in unit tests when scheduling with a delay;
return super.scheduleDirect(run, 0, unit)
}
@NonNull
override fun createWorker(): Scheduler.Worker {
ExecutorScheduler.ExecutorWorker(Executor { it.run() })
}
}
@NonNull
override fun apply(@NonNull base: Statement, @NonNull description: Description): Statement {
return object : Statement() {
@Throws(Throwable::class)
override fun evaluate() {
RxJavaPlugins.setInitIoSchedulerHandler { immediateScheduler }
RxJavaPlugins.setInitComputationSchedulerHandler { immediateScheduler }
RxJavaPlugins.setInitNewThreadSchedulerHandler { immediateScheduler }
RxJavaPlugins.setInitSingleSchedulerHandler { immediateScheduler }
RxAndroidPlugins.setInitMainThreadSchedulerHandler { immediateScheduler }
try {
base.evaluate()
} finally {
RxJavaPlugins.reset()
RxAndroidPlugins.reset()
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment