gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:21:05 26 4
gpt4 key购买 nike

我正在尝试迁移我的应用程序以与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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com