通过改造测试真实的网络响应

时间:2016-05-09 16:48:07

标签: android junit retrofit

在我获得强制性的"之前,您不应该为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的回复都没有测试真正的网络响应,这实际上没有用。

1 个答案:

答案 0 :(得分:1)

解决方案几乎与for volley完全相同。

Retrofit2将默认为平台回调执行程序,在测试中无法正确实例化。

解决方案很简单。如果您希望使用真实网络呼叫测试改造,则必须更改callbackExector。这就是我最终做的事情:

retrofit = new Retrofit.Builder().baseUrl(baseUrl)
     .client(okHttpClient).callbackExecutor(Executors.newSingleThreadExecutor())

网络测试成功运行。