retrofit - 是否可以同步运行 Retrofit observable?

标签 retrofit rx-java synchronous rx-android

我正在尝试迁移我的应用程序以使用 RxJava。 我已经在使用 Retrofit,因此我正在尝试使用方法返回 Observables 的 Retrofit 接口(interface)。 但是我现在在针对它进行编码测试时遇到问题,因为我无法让 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 - 是否可以同步运行 Retrofit observable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34958030/

相关文章:

android - RxJava、Proguard 和 sun.misc.Unsafe

android - RxJava 再次订阅后继续发射

javascript - Web Audio API - 调度问题

php - jQuery AJAX : Get a PHP array AND assign it to a Javascript variable

android - 使用 Retrofit 2.0 发布多部分表单数据,包括图像

php - android room not null 约束在插入时失败

java - 预期为 BEGIN ARRAY,但在第 1 行和第 2 列处为 BEGIN_OBJECT

android - 创建统一的 Action1 以对字段执行检查

javascript - 在继续更改 DOM 函数之前如何等待异步数据库调用解析?

java - bug retrofit.RetrofitError : java. io.EOFException for Android