我正在尝试迁移我的应用程序以与RxJava一起使用。
我已经使用过Retrofit,因此我正在尝试使用Retrofit接口,该方法返回Observables。
但是我现在对它进行编码测试遇到了问题,因为我无法让Observable在主线程上运行。我正在尝试使用Scheduler.immediate()。
看起来Retrofit不允许覆盖它的行为,这对于实际的执行流程是完全有意义的,但是这使测试非常困难。
正如我刚开始使用RxJava + Retrofit一样,我只是希望自己做错了。
下面是代码的样子:
@Test
public void shouldCompleteRequest() {
SomeRestRequest request = new SomeRestRequest(arg1, arg2);
TestSubscriber<SomeRestResponse> testSubscriber = new TestSubscriber<>();
new SomeRestCommand(mRestApi,
arg1, arg2
Schedulers.immediate(),
Schedulers.immediate(),
mMockEventBus).execute(request, testSubscriber);
testSubscriber.assertCompleted();
}
哪里
public void execute(T request, Observer<S> observer) {
getCommand(request)
.observeOn(mObserveOnScheduler) //The test injects Schedulers.immediate()
.subscribeOn(mSubscribeOnScheduler) //The test injects Schedulers.immediate()
.subscribe(observer);
}
,
@Override
protected Observable<SomeRestResponse> getCommand(SomeRestRequest request) {
return mRestApi.restCommand(arg1, arg2);
}
和
public interface RestApi {
@GET("/someEndPoint")
Observable<SomeRestResponse> restCommand(@Query("arg1") String arg1, @Query("arg2") String arg2);
}
最佳答案
如果您修改测试以添加testSubscriber.awaitTerminalEvent();
,那么您的测试将等待调用完成,因此测试将通过。您仍然必须执行assertCompleted()
,因为终端事件可以是成功完成,也可以是错误。
@Test
public void shouldCompleteRequest() {
SomeRestRequest request = new SomeRestRequest(arg1, arg2);
TestSubscriber<SomeRestResponse> testSubscriber = new TestSubscriber<>();
new SomeRestCommand(mRestApi,
arg1, arg2
Schedulers.immediate(),
Schedulers.immediate(),
mMockEventBus).execute(request, testSubscriber);
testSubscriber.awaitTerminalEvent(); // add this line here
testSubscriber.assertCompleted();
}
我查询了Retrofit 1.9.0的源代码,并根据
RxSupport
类,该调用始终在httpExecutor
提供的单独线程中执行。因此,使用Schedulers.immediate()
不会导致调用在主线程中发生。
关于retrofit - 是否可以同步运行可观察的改造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34958030/