我正在尝试迁移我的应用以使用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);
}
答案 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()
不会导致调用在主线程中发生。