是否可以同步运行Retrofit observable?

时间:2016-01-23 00:09:03

标签: retrofit rx-java synchronous rx-android

我正在尝试迁移我的应用以使用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);
}

1 个答案:

答案 0 :(得分:5)

如果您修改测试以添加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()不会导致调用在主线程中发生。