web-dev-qa-db-fra.com

Moqueur de la réponse OKHTTP

J'ai la méthode ci-dessous qui exécute une demande d'obtention 3 fois jusqu'à sa réussite.

Quel serait le meilleur moyen de se moquer de cette méthode? Je veux moquer et tester status_code 401, code d'état 500 et vouloir tester si la méthode est exécutée trois fois.

En Python, nous avons https://github.com/getsentry/responses qui se moque directement des demandes directement, de sorte que c'est facile à tester ces méthodes.

Y a-t-il quelque chose d'équivalent à 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();

        }
9
user1050619

Ce serait difficile à tester car il boucle. Une solution serait de sortir this.client.newCall(request).execute() dans une fonction distincte sendRequest(Request request, int attemptsRemaining). Ensuite, vous pourriez utiliser un espion qui protège cette méthode pour renvoyer différentes réponses en fonction du nombre de tentatives restantes.
[.____] La bonne chose que j'ai réalisée à propos de Okhttp est que vous pouvez simplement construire une fausse réponse vous-même. Par exemple,

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();

Vous pouvez donc créer et muser une méthode simple qui renvoie une réponse, et vous êtes essentiellement bon pour effectuer des tests.

6