在我获得强制性的"之前,您不应该为XYZ原因测试真实的网络响应!" ,应该注意的是我不会询问是否或不是我应该的。
如果我愿意,我会特别询问我将如何这样做。
经过几个小时的挣扎,我已经成功地从 Volley 中得到了适当的回应,然后进行了测试。
我现在遇到的问题是,call.enque(...)
似乎挂在了RobolectricTestRunner上。与Volley不同,我无法查看并了解最新情况在那里(for Volley, the challenge was not realizing that Looper.getMainLooper doesn't get properly created.)
所以,我所做的就是尝试通过Retrofit向服务器发出一个简单的请求。正如我所说,这个问题是整个系统挂起call.enqueue
,并且没有任何错误或响应(即使我的等待时间更长)。网络呼叫在凌空时工作正常,但我在这里遇到了改造的问题。如果您想尝试,请在此处输入代码。当然,当应用程序运行时,该功能正常工作。
//in NetworkManager.class
public void someCall(HashMap properties, NetworkResponseListener listener){
this.okHttpClient = new OkHttpClient.Builder().cache(new Cache(appContext, 35 * 1024 * 1024)).build();
this.retrofit = new Retrofit.Builder().baseUrl(httpPath + apiHost).client(okHttpClient).build();
this.myService = retrofit.create(MyService.class);
Call call = myService.someRequest(properties);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
listener.onSuccess(response);
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
listener.onError(t);
}
});
}
服务:
interface MyService {
@GET("/api/SomeEndpoint/")
Call<ResponseBody> someRequest(@QueryMap Map<String, Object> params);
}
测试:
@Test
public void testSomeCall() throws Exception {
//Network class has setup OkHttpClient/Service/Retrofit already
NetworkResponseListener listener = new NetworkResponseListener() {
@Override
public void onSuccess(Response response) {
this.response = response;
}
@Override
public void onError(Throwable error) {
//
}
};
NetworkManager.someCall(this.properties, listener);
await().atMost(30, TimeUnit.SECONDS).until(ResponseReceived());
}
每个人对stackoverflow的回复都没有测试真正的网络响应,这实际上没有用。
答案 0 :(得分:1)
解决方案几乎与for volley完全相同。
Retrofit2将默认为平台回调执行程序,在测试中无法正确实例化。
解决方案很简单。如果您希望使用真实网络呼叫测试改造,则必须更改callbackExector。这就是我最终做的事情:
retrofit = new Retrofit.Builder().baseUrl(baseUrl)
.client(okHttpClient).callbackExecutor(Executors.newSingleThreadExecutor())
网络测试成功运行。