Search code examples
androidunit-testingrx-javarx-android

RxJava not running in UniTest Android (Not androidTest)


I newbiew about rxjava and play RxJava in Unitest, but the Observable not running.

@Test
fun notepad(){
    val scheduler = TestScheduler()
    val subscriber = TestObserver<String>()
    RxJavaPlugins.setComputationSchedulerHandler{ scheduler }
    Single.just("Data Local")
        .toObservable()
        .subscribeOn(Schedulers.computation())
        .observeOn(Schedulers.computation())
        .map { "Map Local" }
        .observeOn(Schedulers.computation())
        .flatMap { Observable.just(1) }
        .map { "Map Remote" }
        .startWith { "StartWith" }
        .onErrorReturn { "Error Return" }
        .subscribe(subscriber)
    scheduler.advanceTimeBy(2, TimeUnit.SECONDS)
    print("${subscriber.hasSubscription()}")
}

but subscriber.hasSubscription() return false. how can i get the onNext value, or its because my Observable wrong?

Thanks


Solution

  • RxJava v2 has very useful method test. It provides functionality for testing your observables in easy way. Rewrite your test by this way and use many of assertion methods, that provide RxJava:

    Your edited code

    @Test
    fun notepad(){
        val scheduler = TestScheduler()
        val subscriber = TestObserver<String>()
        RxJavaPlugins.setComputationSchedulerHandler{ scheduler }
        Single.just("Data Local")
            .toObservable()
            .subscribeOn(Schedulers.computation())
            .observeOn(Schedulers.computation())
            .map { "Map Local" }
            .observeOn(Schedulers.computation())
            .flatMap { Observable.just(1) }
            .map { "Map Remote" }
            .startWith { "StartWith" }
            .onErrorReturn { "Error Return" }
            .test()
            .await()
            .assertValueAt(0) { startString->
                    yourString == "StartWith"
                }
            .assertValueAt(1) { mapString->
                    mapString == "Map Remote"
                }
        scheduler.advanceTimeBy(2, TimeUnit.SECONDS)
    }
    

    If you want to learn about it more checkout this link