【问题标题】:RxJava not running in UniTest Android (Not androidTest)RxJava 未在 UniTest Android 中运行(不是 androidTest)
【发布时间】:2019-09-03 07:25:13
【问题描述】:

我是 rxjava 新手,在 Unitest 中玩 RxJava,但 Observable 没有运行。

@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()}")
}

但是subscriber.hasSubscription() 返回false。我怎样才能得到 onNext 值,或者它是因为我的 Observable 错误?

谢谢

【问题讨论】:

    标签: android unit-testing rx-java rx-android


    【解决方案1】:

    RxJava v2 有非常有用的方法test。它提供了以简单的方式测试你的 observables 的功能。用这种方式重写你的测试并使用许多提供 RxJava 的断言方法:

    您编辑的代码

    @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)
    }
    

    如果您想了解更多信息,请查看this link

    【讨论】:

    • 但是为什么总是等待 .await() 这意味着我的 Observable 没有调用 onComplete?
    • 不,await 是当您在多个线程中进行一些操作时需要的(例如您在示例中使用 Schedulers.computation())。它等待值,并且仅在调用断言方法之后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多