rx java - RxJava 2 overriding IO scheduler in unit test -
i'm trying test following rxkotlin/rxjava 2 code:
validate(data) .subscribeon(schedulers.io()) .observeon(androidschedulers.mainthread()) .flatmap { ... } i'm attempting override schedulers follows:
// runs before each test suite rxjavaplugins.setinitioschedulerhandler { schedulers.trampoline() } rxandroidplugins.setinitmainthreadschedulerhandler { schedulers.trampoline() } however, following error when running test:
java.lang.exceptionininitializererror ... caused by: java.lang.nullpointerexception: scheduler callable result can't null @ io.reactivex.internal.functions.objecthelper.requirenonnull(objecthelper.java:39) @ io.reactivex.plugins.rxjavaplugins.applyrequirenonnull(rxjavaplugins.java:1317) @ io.reactivex.plugins.rxjavaplugins.initioscheduler(rxjavaplugins.java:306) @ io.reactivex.schedulers.schedulers.<clinit>(schedulers.java:84) has experienced problem?
the test worked fine when using rxkotlin/rxjava 1 , following scheduler overrides:
rxandroidplugins.getinstance().registerschedulershook(object : rxandroidschedulershook() { override fun getmainthreadscheduler() = schedulers.immediate() }) rxjavaplugins.getinstance().registerschedulershook(object : rxjavaschedulershook() { override fun getioscheduler() = schedulers.immediate() }) thanks!
i suggest take different approach , add layer of abstraction schedulers. guy has nice article it: https://medium.com/@peter.tackage/an-alternative-to-rxandroidplugins-and-rxjavaplugins-scheduler-injection-9831bbc3dfaf
it in kotlin
interface schedulerprovider { fun ui(): scheduler fun computation(): scheduler fun trampoline(): scheduler fun newthread(): scheduler fun io(): scheduler } and override own implementation of schedulerprovider:
class appschedulerprovider : schedulerprovider { override fun ui(): scheduler { return androidschedulers.mainthread() } override fun computation(): scheduler { return schedulers.computation() } override fun trampoline(): scheduler { return schedulers.trampoline() } override fun newthread(): scheduler { return schedulers.newthread() } override fun io(): scheduler { return schedulers.io() } } and 1 testing classes:
class testschedulerprovider : schedulerprovider { override fun ui(): scheduler { return schedulers.trampoline() } override fun computation(): scheduler { return schedulers.trampoline() } override fun trampoline(): scheduler { return schedulers.trampoline() } override fun newthread(): scheduler { return schedulers.trampoline() } override fun io(): scheduler { return schedulers.trampoline() } } your code call rxjava:
mcompositedisposable.add(mdatamanager.getquote() .subscribeon(mschedulerprovider.io()) .observeon(mschedulerprovider.ui()) .subscribe(consumer<quote> { ... and you'll override implementation of schedulerprovider based on test it. here's sample project reference, linking test file use testable-version of schedulerprovider: https://github.com/obaied/dingerquotes/blob/master/app/src/test/java/com/obaied/dingerquotes/quotepresentertest.kt#l31
Comments
Post a Comment