Skip to content

Instantly share code, notes, and snippets.

@starkej2
Last active December 30, 2021 18:33
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save starkej2/c446012d540b8e25409fa525c6d17cb1 to your computer and use it in GitHub Desktop.
Save starkej2/c446012d540b8e25409fa525c6d17cb1 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(run: Runnable, delay: Long, 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(): Worker {
return ExecutorScheduler.ExecutorWorker({ it.run() }, false)
}
}
@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()
}
}
}
}
}
@simplekjl
Copy link

This file is awesome! quick question,

on line 14 does the object has to be returned?

@starkej2
Copy link
Author

Yes it does @simplekjl, Nice catch! I've updated the gist.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment