RxJava watchOn / subscribeOn仅在测试环境中有效

时间:2019-07-06 17:21:44

标签: android kotlin observable rx-java subscriber

我有这个AsyncSubject

val asyncSubject = AsyncSubject.create<Int>()
observable.observeOn(AndroidSchedulers.mainThread())
          .subscribeOn(Schedulers.newThread())
          .subscribe(asyncSubject)

如果我在测试环境(androidTest文件夹)中做类似的事情

asyncSubject.subscribe{
    // enter only in test environment
}

它仅在测试期间输入,但我在未输入的活动中运行了相同的代码。

使其在测试环境和正常环境下均可运行的唯一方法是删除:

.observeOn(Schedulers.newThread())
.subscribeOn(AndroidSchedulers.mainThread())

我做错了什么?

这些是我的依赖项:

implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'io.reactivex.rxjava2:rxjava:2.2.8'

编辑:

它似乎仅在我尝试更改外部变量时才起作用。 一个例子:

val observable = Observable.just(1, 2, 3, 4, 5)
val asyncSubject = AsyncSubject.create<Int>()
observable.subscribeOn(Schedulers.newThread())
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(asyncSubject)
val signal = CountDownLatch(5)
var i = 0
asyncSubject.subscribe{
    i = it
    signal.countDown()
}
signal.await()
// After that `i` is always 0 

2 个答案:

答案 0 :(得分:0)

运行Java单元测试时,无法执行AndroidSchedulers.mainThread()

您可以做的是创建一个测试规则,以便能够以同步方式执行单元测试。

在此answer中,您会找到详细的说明。

您可以从here处获得规则。

答案 1 :(得分:0)

在致电sbscribe进行订阅之前,您应该asyncSubjectobservable。另外,Observable.just(..)不遵守计划程序,因此您的subscribeOn/observeOn在这里不会起作用。