我是Retrofit 2.0的新手,我想问一问使用此工具进行单元测试的最佳方法,尤其是对于异步请求.
我找到了一篇很好的文章here,我对使用本地JSON静态文件进行单元测试很感兴趣,因为我认为它会更快,并且并不总是需要Internet连接,但是当我实现时它不会起作用在Retrofit 2.0上.在Retrofit 2.0中可以这样做吗?
也许有人可以在这里为我提供良好的参考,或者关于如何进行这些单元测试的良好示例吗?
对不起,我的英语不好.
解决方法:
这是使用OkHttp Interceptor
实现的翻新2的参考方法的快速翻译.我对其进行了快速测试,但是没有什么太深的.让我知道您是否有任何问题.
public class LocalResponseInterceptor implements Interceptor {
private Context context;
private String scenario = null;
public LocalResponseInterceptor(Context ctx) {
this.context = ctx;
}
public void setScenario(String scenario) {
this.scenario = scenario;
}
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
URL requestedUrl = request.url();
String requestedMethod = request.method();
String prefix = "";
if (this.scenario != null) {
prefix = scenario + "_";
}
String fileName = (prefix + requestedMethod + requestedUrl.getPath()).replace("/", "_");
fileName = fileName.toLowerCase();
int resourceId = context.getResources().getIdentifier(fileName, "raw",
context.getPackageName());
if (resourceId == 0) {
Log.wtf("YourTag", "Could not find res/raw/" + fileName + ".json");
throw new IOException("Could not find res/raw/" + fileName + ".json");
}
InputStream inputStream = context.getResources().openRawResource(resourceId);
String mimeType = URLConnection.guessContentTypeFromStream(inputStream);
if (mimeType == null) {
mimeType = "application/json";
}
Buffer input = new Buffer().readFrom(inputStream);
return new Response.Builder()
.request(request)
.protocol(Protocol.HTTP_1_1)
.code(200)
.body(ResponseBody.create(MediaType.parse(mimeType), input.size(), input))
.build();
}
}
将此拦截器添加到自定义OkHttpClient中-
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.interceptors().add(new LocalResponseInterceptor(context));
其中context是一个android Context.
并将该客户添加到您的改造中-
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();