使用本地JSON进行2.0版Android单元测试

我是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();
上一篇:使用Retrofit进行网络请求


下一篇:Retrofit源码解析