在做单元测试的时候如果遇到了网络请求的测试,因为牵涉到异步,如果直接运行测试代码,就会发现,测试代码走完的时候,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();
}
}