我这个问题已经有一段时间了 这是我正在测试的代码
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。
任何想法为什么从未达到代码?
答案 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。
现在它工作正常。感谢所有尝试过的人。