Android PublishSubject和TestScheduler出现问题,项目编号为';t发射

Android PublishSubject和TestScheduler出现问题,项目编号为';t发射,android,unit-testing,testing,rx-java,rx-android,Android,Unit Testing,Testing,Rx Java,Rx Android,我一直面临主题和测试调度程序的问题。如果我使用Trampoline调度程序,我的测试就会通过,但是由于某种原因,如果我使用TestScheduler,测试就会失败 这是我的样本测试和相关课程 @RunWith(MockitoJUnitRunner::class) class DemoViewModelTest { //Error Mocks private val actionsStream: PublishSubject<DemoContract.ViewEvent

我一直面临主题和测试调度程序的问题。如果我使用Trampoline调度程序,我的测试就会通过,但是由于某种原因,如果我使用TestScheduler,测试就会失败

这是我的样本测试和相关课程

@RunWith(MockitoJUnitRunner::class)
class DemoViewModelTest  {


    //Error Mocks
    private val actionsStream: PublishSubject<DemoContract.ViewEvent> = PublishSubject.create()

    private lateinit var viewModel: DemoViewModel

    private val handler = mock(DemoContract.Handler::class.java)

    @Before
    fun setup() {
        viewModel = DemoViewModel(schedulersProvider, handler)
        viewModel.viewEventsStream = actionsStream
    }

    @Test
    fun testUpdateCounter() {
        actionsStream.onNext(DemoContract.ViewEvent.UpdateClick)
        testScheduler.triggerActions()
        verify(handler).onUpdate()

    }


    protected var testScheduler = TestScheduler()

    protected var schedulersProvider: SchedulersProvider = object : SchedulersProvider() {
        override fun mainThread(): Scheduler {
            return testScheduler
        }

        override fun io(): Scheduler {
            return testScheduler
        }

        override fun computation(): Scheduler {
            return testScheduler
        }

        override fun newThread(): Scheduler {
            return testScheduler
        }

        override fun trampoline(): Scheduler {
            return testScheduler
        }

        override fun single(): Scheduler {
            return testScheduler
        }
    }
}
关于这件事,如果我替换

viewModel.viewEventsStream = actionsStream

这个测试通过了


有人能解释一下吗,提前谢谢。这是最低可运行值

非常感谢@akarnokd为我指明了正确的方向。事实证明,这是正在添加的
PublishSubject
的订户(
subscribeActual
调用)和我在测试中触发的onNext调用之间的竞争条件
onNext
调用在前者发生之前返回

解决方案是在订阅后立即显式调用两次
triggerations
,在发布后显式调用一次

改变这个

    @Before
    fun setup() {
        viewModel = DemoViewModel(schedulersProvider, handler)
        viewModel.viewEventsStream = actionsStream
    }


如果在
subscribeOn()
运算符之前插入日志语句,会发生什么情况?尝试
.doOnNext(v->logger.debug(v.toString())
-它没有被调用,如果您愿意,这里有一个简单的可复制的git项目。在调用
onNext
之前,检查
actionstream.hasObservators
是否为true。是否调用过
subscribeToViewEvents
actionstream.hasObservators
是否为false
viewModel.viewEventsStream = actionsStream
viewModel.viewEventsStream = Observable.just(DemoContract.ViewEvent.Update)
    @Before
    fun setup() {
        viewModel = DemoViewModel(schedulersProvider, handler)
        viewModel.viewEventsStream = actionsStream
    }
    @Before
    fun setup() {
        viewModel = DemoViewModel(schedulersProvider, handler)
        viewModel.viewEventsStream = actionsStream
        testScheduler.triggerActions()
    }