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

Popular posts from this blog

How to understand 2 main() functions after using uftrace to profile the C++ program? -

c# - Update a combobox from a presenter (MVP) -

How to put a lock and transaction on table using spring 4 or above using jdbcTemplate and annotations like @Transactional? -