web-dev-qa-db-fra.com

Rest Assured - désérialisez le JSON de réponse sous forme de liste <POJO>

J'ai un POJO Artwork. Je récupère une List de ces objets d'un service Web RESTful dans le corps de la réponse HTTP au format JSON. J'essaie d'écrire un test reposant sur l'assuré qui analyserait la liste renvoyée. Le code ressemble à ceci:

Response response = get("/artwork");
List returnedArtworks = response.getBody().as(List.class)

Le problème est que je ne peux pas demander à Rest Assured d'analyser le code JSON renvoyé en tant que List<Artwork>. Au lieu de cela, je reçois un List<LinkedHashMap>. La carte a une structure appropriée, c’est-à-dire que Jackson pourrait mapper l’objet Artwork, mais j’aimerais éviter de la mapper manuellement. 

Les mappages JSON dans mon modèle sont acceptables, car lorsque je mappe un seul objet comme ceci:

Artwork returnedArtwork = response.getBody().as(Artwork.class);

ça fonctionne bien.

Est-il possible d'obtenir returnedArtworks en tant que List<Artwork>

14
Wojtek

Tu peux le faire:

List<Artwork> returnedArtworks = Arrays.asList(response.getBody().as(Artwork[].class));

L'astuce consiste à désérialiser JSON en un tableau d'objets (car il n'y a pas de différence entre la chaîne JSON d'un tableau ou d'une liste), puis de convertir le tableau en liste.

19
volatilevar

cette solution fonctionne pour la version 3.0.2 (io.restassured):

  JsonPath jsonPath = RestAssured.given()
     .when()
     .get("/order")
     .then()
     .assertThat()
     .statusCode(Response.Status.OK.getStatusCode())
     .assertThat()
     .extract().body().jsonPath();

  List<Order> orders = jsonPath.getList("", Order.class);

Cela va extraire les objets pour une structure comme celle-ci:

public class Order {

private String id;

public String getId(){
return id; }

public void setId(String id){
this.id = id;
}


}

avec le json donné:

[ 
{ "id" : "5" }, 
{ "id" : "6" }
]
3
Seren

En utilisant la bibliothèque Gson de Google, vous pouvez facilement l'analyser en List<Artwork>. Essayez ci-dessous le code 

Gson gson = new Gson();
List<Artwork> returnedArtworks = gson.fromJson(jsonStr, new TypeToken<List<Artwork>>(){}.getType());

//* where jsonStr is the response string(Json) receiving from your Restful webservice
1
Uttam

Avec REST assure 3.0.2, vous pouvez simplement vérifier si le contenu existe dans le tableau.

when().get("/artwork").then().body("artworks", hasItem("some art");
//or check multiple values in array
when().get("/artwork").then().body("artworks", hasItems("some art", "other art");

De cette façon, vous éviterez la complexité de votre code en convertissant JSON en une liste plus complète d'exemples montrant comment vérifier le contenu de la réponse. link

0
Vytautas