android对网络请求做单元测试等不到callback的问题

158 阅读1分钟

在做单元测试的时候如果遇到了网络请求的测试,因为牵涉到异步,如果直接运行测试代码,就会发现,测试代码走完的时候,callback还在路上没有回来,这时候一回头,发现爸爸没有了,很尴尬,所以就永远拿不到回调数据,网络上也有很多办法解决,把异步请求改为同步测试,用CountDownLatch的方式,还有rxjava的方式,但是如果网络请求用的异步的execute进行请求,这些方式我都试过了,并没有什么效果,这里介绍一种稍微粗暴的方式,其实原理都是一样的,就是线程等待:

    @Test
    public void requestTest2(){
        FakeHttp.getFakeHttpLayer().interceptHttpRequests(false);
        String url = URlmentor.BASEURL + URlmentor.app_time;
        NetHelper.instance().get(url, new ObjectCallback<AppTime>(AppTime.class) {
            @Override
            public void onResponse(AppTime response, int id) {
                System.out.println("异步结果:"+response.toString());
            }

            @Override
            public int errorHandle(Call call, Exception e, int id) {
                return 0;
            }
        });
        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
    }

当然,如果你只是测试接口的话,也可以用同步的方式进行

    @Test
    public void requestTest() throws Exception {
        //设置是否拦截真实的请求。若不设置则默认为TRUE,若设false,则会真实访问网络。
        FakeHttp.getFakeHttpLayer().interceptHttpRequests(false);
        String url = URlmentor.BASEURL + URlmentor.app_time;
        URL url1 = new URL(url);
        HttpURLConnection connection = (HttpURLConnection) url1.openConnection();
        InputStream inputStream = connection.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String result = new String(reader.readLine().getBytes(), "UTF-8");
        System.out.println(result);
        assertNotNull(result);
    }

或者

  /**
     * 同步回调
     * @throws Exception
     */
    @Test
    public void requestTest1() throws Exception {
        //设置是否拦截真实的请求。若不设置则默认为TRUE,若设false,则会真实访问网络。
        FakeHttp.getFakeHttpLayer().interceptHttpRequests(false);
        String url = URlmentor.BASEURL + URlmentor.app_time;
//        final CountDownLatch latch = new CountDownLatch(1);
                try {
                    Response response = OkHttpUtils.get()
                            .url(url)
                            .build()
                            .execute();
                    InputStream responseIs = response.body().byteStream();
                    BufferedReader responseBufferedReader = new BufferedReader(new InputStreamReader(responseIs, "utf-8"));
                    StringBuilder responseStringBuilder = new StringBuilder();
                    while (true) {
                        String readLine = responseBufferedReader.readLine();
                        if (readLine == null) {
                            break;
                        }
                        responseStringBuilder.append(readLine);
                    }
                    responseIs.close();
                    result = responseStringBuilder.toString();
                    System.out.println("result == "+ result);
                } catch (IOException e) {
                    e.printStackTrace();
                }
    }