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。
现在它工作正常。感谢所有尝试过的人。
我已经研究这个问题一段时间了 这是我正在测试的代码
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。
现在它工作正常。感谢所有尝试过的人。