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