retrofit - 是否可以同步运行可观察的改造?

标签 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);
}

最佳答案

如果您修改测试以添加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/

相关文章:

由 Retrofit 回调填充的 Android 适配器

android - 在 RetrofitError 中捕获错误并将其传递给 RoboSpice Error

android - Retrofit 返回错误 401,Android 4.4.2 的 NullPointerException

android - 在执行另一个 Observable 之前等待一个 Observable 完成?

java - 在开始另一个任务之前等待一个任务在 Java 中完成

android - Kotlin和Retrofit:如何处理HTTP 400响应?

android - 使用 Rx 去抖按钮点击

java - RxJava : buffer items until some condition is true for current item

javascript - 同步 jQuery 调用,无需将所有内容放入回调中

ios - 如何将同步post请求转换为异步post请求?