我偶然发现了一个奇怪的testScheduler行为,无法解决问题。下面的代码已大大简化,但起源于现实生活中的问题。
考虑以下测试:
@Test
fun testSchedulerFun(){
val testScheduler = TestScheduler()
val stringsProcessor = PublishProcessor.create<String>()
val completable = Completable.complete()
completable
.doOnComplete { stringsProcessor.onNext("onComplete") }
.subscribeOn(testScheduler)
.subscribe()
val testSubscriber = stringsProcessor
.subscribeOn(testScheduler) //this line of code messes the test
.test()
testScheduler.triggerActions()
testSubscriber
.assertValues("onComplete")
}
**当我在stringsProcessor
上订阅了经过测试的testScheduler
时,测试将失败。当我删除该行时,它会成功。 **我看到的事件流是:
stringsProcessor.onNext("onComplete")
进行了评估。 我想知道为什么
最佳答案
测试失败的原因是,您在其上调用stringProcessor
的时间onNext
没有订阅者。该订阅者仅次于此,因为您添加了“此行混乱” subscribeOn
。
不涉及竞争条件,因为一切都以确定的顺序在同一线程上运行:
completable ... subscribe()
部分时,一个任务与testScheduler
排队,将执行doOnComplete调用。 test
部分时,另一个任务与testScheduler
一起排队,它将观察处理器。