2015-08-13 1 views
10

J'ai un problème avec la demande POST avec repos-assuré.La requête POST échoue (test de repos-repos)

Ce code fonctionne:

given().contentType(ContentType.JSON).body("{\"key\": \"val\"}").  
     when().post(url + resource).then().assertThat().statusCode(200).body("otherVal", equalTo(otherVal)); 

Mais je tentais d'utiliser param() ou parameter() des méthodes telles que:

Celui-ci donne:

given().parameter("key", "val").          
     when().post(url + resource).then().assertThat().statusCode(200); 

Expected status code <200> doesn't match actual status code <415>.

Ce:

given().parameter("key", "val").               
      when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal)); 

java.lang.IllegalStateException: Expected response body to be verified as JSON, HTML or XML but no content-type was defined in the response. Try registering a default parser using: RestAssured.defaultParser(<parser type>);

Et ceci:

RestAssured.defaultParser = Parser.JSON;             
given().parameter("key", "val").              
     when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal)); 

java.lang.IllegalArgumentException: The JSON input text should neither be null nor empty

Je suis à court d'idées ce qui est erroné. Ce que j'essaie de faire est d'éviter d'écrire des jsons complètes pour tous les tests, ce sera plus rapide si je pouvais passer tous les "" et {}. Mon approche est-elle correcte?

Répondre

11

Regardons à votre premier exemple:

given().contentType(ContentType.JSON).body("{\"key\": \"val\"}").  
     when().post(url + resource).then().assertThat().statusCode(200).body("otherVal", equalTo(otherVal)); 

Qu'est-ce qui se passe ici est que vous mettez { "key" : "val" } (sous forme de texte) dans le corps de la demande. Ce texte arrive à être JSON. Du point de vue de REST Assured vous pourriez aussi bien mettre { "key" : "val" qui n'est pas valide JSON. Votre serveur répond correctement car le serveur requiert et comprend JSON. Il comprend que le corps doit être JSON depuis que vous avez passé JSON en tant que type de contenu.

Alors regardons votre deuxième exemple:

given().parameter("key", "val").          
     when().post(url + resource).then().assertThat().statusCode(200); 

Voici votre service retourne 415 parce que vous êtes absent le type de contenu JSON. Qu'est-ce qui se passe lorsque vous utilisez param ou parameter avec POST est que vous créez des paramètres de formulaire. Les paramètres de formulaire sont également envoyés dans le corps de la requête MAIS les paramètres de formulaire ne sont pas JSON!Spécification « clé » et « val » en tant que paramètre de forme comme vous sera le même que celui-ci:

given().contentType("x-www-form-urlencoded").body("key=val").when().url + resource).then().assertThat().statusCode(200); 

Donc, dans votre deuxième exemple, il y a en fait deux problèmes:

  1. Vous n'êtes pas envoyer JSON
  2. vous avez le mauvais type de contenu

Et à cause de (2), vous obtenez 415 du serveur

Passons à votre troisième exemple:

given().parameter("key", "val").               
      when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal)); 

Qu'est-ce que (probablement) se produit ici est que votre serveur ne contient pas de corps de la réponse car il attend la demande d'inclure « application/json » en tant que contenu -type. Il n'y a donc pas de corps à affirmer (la demande est fausse)! La réponse contient uniquement l'état 415 (ligne) en tant qu'en-tête.

Ce qui nous conduit à votre dernier exemple:

RestAssured.defaultParser = Parser.JSON;             
given().parameter("key", "val").              
     when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal)); 

Ici vous instruisez rassurez-vous pour traiter un type de contenu manquant JSON mais le problème (encore une fois) est que votre serveur ne fonctionne pas retourner tout corps de réponse du tout, cela ne va pas aider.

Solution:

Vous devriez mettre un cadre objet cartographique JSON pris en charge (Jackson, Jackson Plus rapide, simple JSON ou Gson) dans votre classpath (par exemple jackson-databind) et il suffit de créer une carte comme décrit dans la documentation:

Map<String, Object> jsonAsMap = new HashMap<>(); 
map.put("key", "val"); 

given(). 
     contentType(ContentType.JSON). 
     body(jsonAsMap). 
when(). 
     post(url + resource). 
then(). 
     statusCode(200). 
     body("otherVal", equalTo(otherVal)); 

Depuis la création de cartes en Java est tout à fait que je fais habituellement bavard quelque chose comme ça si je cartes imbriquées:

given(). 
     contentType(ContentType.JSON). 
     body(new HashMap<String,Object>() {{ 
      put("key1, "val1"); 
      put("key2, "val2"); 
      put("key3", asList("val3", "val4")); 
      put("nested", new HashMap<String,String>() {{ 
       put("key4", "val4"); 
       put("key5", "val5"); 
      }}); 
     }}). 
when(). 
     post(url + resource). 
then(). 
     statusCode(200). 
     body("otherVal", equalTo(otherVal)); 

Ou vous créez une représentation DTO de vos données et passez juste un objet à Rassurez-vous:

MyDTO myDTO = new MyDTO(...); 
given(). 
     contentType(ContentType.JSON). 
     body(myDTO). 
when(). 
     post(url + resource). 
then(). 
     statusCode(200). 
     body("otherVal", equalTo(otherVal)); 

Vous pouvez lire plus dans la object-mapping documentation.

+0

https://github.com/rest-assured/rest-assured/issues/744, il y a bug dans 2 dernière approche. Pour moi passer JSON en tant que chaîne a parfaitement fonctionné. J'ai imbriqué JSON – vikramvi

1

que je cherchais réponse et je me suis dit qu'il trop ..

ajouter un fichier à votre src/test/dossier resouces et ajoutez ce code à votre test. Devrait être tout bon

URL file = Resources.getResource("ModyNewFieldsReq.json"); 
String myRequest = Resources.toString(file,Charsets.UTF_8); 

Response fieldResponse = given() 
     .header("Authorization", AuthrztionValue) 
     .header("X-App-Client-Id", XappClintIDvalue) 
     .contentType("application/vnd.api+json") 
     .body(myRequest).with() 

    .when() 
     .post(dataPostUrl)  

    .then() 
     .assertThat() 
     .log().ifError() 
     .statusCode(200) 
     .extract().response(); 

Assert.assertFalse(fieldResponse.asString().contains("isError"));