Издевательский охтп ответ - PullRequest
0 голосов
/ 29 января 2019

У меня есть метод ниже, который выполняет запрос GET 3 раза, пока он не будет успешно.

Что было бы лучшим способом для насмешки этого метода?Я хочу смоделировать и протестировать код status_code 401, код статуса 500 и проверить, выполняется ли метод трижды.

В python у нас есть https://github.com/getsentry/responses, который непосредственно проверяет запросы, поэтому его легкопротестируйте эти методы.

Есть ли что-нибудь эквивалентное в Java.

@Override
    public <T> UResponse<T> get(Request request, JSONUnmarshaler<T> unmarshaller, Gson gson) throws UException {
        int status_code = 0;
        String next = null;
        String rawJSON = null;
        JsonElement jsonelement = null;
        Boolean retry = true;
        try {
            int attempts = 3;
            while ((attempts >= 0)  && (retry) && status_code != 200){
                Response response = this.client.newCall(request).execute();

                rawJSON = response.body().string();

                jsonelement = gson.fromJson(rawJSON, JsonElement.class);

                next = gson.fromJson(jsonelement.getAsJsonObject().get("next"), String.class);

                status_code = response.code();

                if (status_code == 401) {
                    try {
                        logger.warn("token expired");
                        TimeUnit.SECONDS.sleep(5);
                        retry = true;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                if ((status_code / 100 ) == 5){
                    logger.warn("gateway error");
                    retry = true;                   
                }
                attempts -= 1;
                retry = false;

            }
            if (status_code != 200){
                throw new UException();
            }
            return new UResponse<T>(status_code, next, rawJSON,
                    unmarshaller.fromJSON(gson, jsonelement.getAsJsonObject()));

        } catch (IOException e) {
            e.printStackTrace();
            throw new UException();

        }

1 Ответ

0 голосов
/ 08 мая 2019

Это было бы трудно проверить, потому что это циклы.Одним из решений было бы выделение this.client.newCall(request).execute() на отдельную функцию sendRequest(Request request, int attemptsRemaining).Затем вы могли бы использовать шпиона, который заглушает этот метод, чтобы возвращать разные ответы в зависимости от количества оставшихся попыток.
Приятная вещь, которую я понял в okhttp, заключается в том, что вы можете просто создать поддельный ответ самостоятельно.Например,

Request mockRequest = new Request.Builder()
                .url("https://some-url.com")
                .build();
return new Response.Builder()
                .request(mockRequest)
                .protocol(Protocol.HTTP_2)
                .code(401) // status code
                .message("")
                .body(ResponseBody.create(
                        MediaType.get("application/json; charset=utf-8"),
                        "{}"
                ))
                .build();

Таким образом, вы можете создать и заглушить простой метод, который возвращает ответ, и вы в принципе готовы пойти на тестирование.

...