使用looper的调度程序时,在测试期间永远不会调用Observable.create

时间:2018-03-19 08:24:30

标签: java android testing rx-java robolectric

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

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的调度程序(该类继承自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运行并且调度程序存在。当我运行应用程序时,它运行良好。我正在使用RobolectricTestRunner。 任何想法为什么从未达到代码?

2 个答案:

答案 0 :(得分:0)

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

.subscribeOn(scheduler)

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

obs.subscribe(testSubscriber)

不一样。请使您的Presenter(或任何保持prepare()方法)获得调度程序。在生产代码中,通过正常的调度程序并测试TestSchubscriber。

答案 1 :(得分:0)

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

    @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会影响looper类,因此在那里排队的runnables从未被调用过。
为了解决这个问题,我与shadow类进行了交互,并让它运行了Observable.create。我之前尝试过,但是在调用subscribe之前我已经尝试过,之后必须调用它。 This helped me understand that。 现在它工作正常。感谢所有尝试过的人。