【问题标题】:How to trigger IOException in response.body().string() with MockWebServer如何使用 MockWebServer 在 response.body().string() 中触发 IOException
【发布时间】:2021-05-22 04:08:34
【问题描述】:

我有这个改造电话:

api.enqueue(new Callback<ResponseBody>() {

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
        t.printStackTrace();
    }

    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

        try {
            if (response.isSuccessful()) { // 200 - 300
                String responseBody = response.body().string();
                ...
            }
        } catch (IOException e) {
            e.printStackTrace()
        }
    }
}

并希望使用 MockWebServer 触发 .string() 中的 IOException

我试过了

        MockResponse mockResponse = new MockResponse()
            .setResponseCode(200)
            .setSocketPolicy(SocketPolicy.DISCONNECT_DURING_RESPONSE_BODY)
            .setBody("{}");

但这最终会出现在OnFailure

如何触发IOException

【问题讨论】:

    标签: android retrofit okhttp mockwebserver


    【解决方案1】:

    类似下面的东西

      private void responseBodyFail(Protocol expectedProtocol) throws IOException {
        // Use a 2 MiB body so the disconnect won't happen until the client has read some data.
        int responseBodySize = 2 * 1024 * 1024; // 2 MiB
        server.enqueue(new MockResponse()
            .setBody(new Buffer().write(new byte[responseBodySize]))
            .setSocketPolicy(SocketPolicy.DISCONNECT_DURING_RESPONSE_BODY));
    

    【讨论】:

    • 谢谢,但它不起作用。它仍然以“onFailure”结束。我认为连接应该是成功的,但是我需要篡改响应体。
    • 这就是 API。所以最好是制作一个带有 bug 再现的 PR 并提交一个 bug。
    • “这就是 API”是什么意思?你是说这是改造的问题吗?
    • 请进行重现测试并提交错误。
    猜你喜欢
    • 2011-12-01
    • 2016-03-06
    • 1970-01-01
    • 2022-01-19
    • 2021-09-19
    • 2017-05-12
    • 2020-08-19
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多