Observable.create 在使用循环程序的调度程序时从不在测试期间调用

Observable.create is never called during tests when using the looper's scheduler

我已经研究这个问题一段时间了 这是我正在测试的代码

public Observable<Void> prepare() {
        return Observable.<Void>create(subscriber -> {  
           // Some work is being done here but this part is never reached
            subscriber.onCompleted();
        }).subscribeOn(scheduler);
}

调度器是looper的调度器(class继承自HandlerThread)

我写的测试如下:

@Test
public void prepare() throws Exception {
    TestSubscriber<Void> testSubscriber = new TestSubscriber<>();
    subject.start();
    Observable<Void> obs = subject.prepare();
    obs.subscribe(testSubscriber);
    testSubscriber.awaitTerminalEvent(15, TimeUnit.SECONDS);
    //assertions go here
    subject.quit();
} 

问题是 Observable.create 中的代码永远不会到达,并且总是会遇到 testSubscriber 的超时。
我已经检查了 looper 运行s 和调度程序是否存在。当我 运行 应用程序时它运行良好。我正在使用 RobolectricTestRunner。 为什么永远无法达到代码的任何想法?

生产代码中使用的调度程序:

.subscribeOn(scheduler)

和测试中使用的调度程序:

obs.subscribe(testSubscriber)

不一样。请让您的演示者(或任何拥有 prepare() 方法的东西)获得调度程序。比在生产代码中传递您的正常调度程序并测试您的 TestSchubscriber。

好的,我找到答案了。
这是我的测试现在的样子:

    @Test
    public void prepare() throws Exception {
        TestSubscriber<Void> testSubscriber = new TestSubscriber<>();
        subject.start();
        Observable<Void> obs = subject.prepare();
        obs.subscribe(testSubscriber);
        shadowOf(subject.getLooper()).getScheduler().advanceToNextPostedRunnable();
        testSubscriber.awaitTerminalEvent(15, TimeUnit.SECONDS);
        //assertion go here
        subject.quit();
    }

我遇到的问题是 Robolectric 隐藏了循环器 class 因此 运行 在那里排队的 nables 从未被调用过。
为了解决这个问题,我与阴影 class 进行了交互,并将其设置为 运行 Observable.create。我之前试过,但我是在调用 subscribe 之前完成的,之后必须调用它。 This helped me understand that。 现在它工作正常。感谢所有尝试过的人。