2017-07-10 1 views
0

J'ai un critère d'évaluation de l'API POST qui retourne un objet JSON structuré comme ceci:Mise en place d'une réponse JSON avec une valeur imbriquée dans un Java POJO

  • données (les données originales que j'ai envoyé vers le haut)
  • JsonAPI (Le version de l'API JSON le point final est conforme à)
  • statut (l'état de l'appel à l'extrémité)
  • message (Utilisé dans le cas d'une erreur de validation du schéma)

Tous ces éléments sont stockés dans le POJO suivant à l'aide GSON fromJson():

package json.responses; 
import com.google.gson.JsonElement; 

public class SupplierResponseTest { 

    private StatusResponse status; 
    private JsonElement jsonapi; 
    private String message; 
    private JsonElement data; 


    public SupplierResponseTest(StatusResponse status, JsonElement jsonapi) { 
     this.status = status; 
     this.jsonapi = jsonapi; 

    } 
    public SupplierResponseTest(StatusResponse status, JsonElement jsonapi, String message) { 
     this.status = status; 
     this.jsonapi = jsonapi; 
     this.message = message; 
    } 
    public SupplierResponseTest(StatusResponse status, JsonElement jsonapi, JsonElement data) { 
     this.status = status; 
     this.jsonapi = jsonapi; 
     this.data = data; 

    } 
    public StatusResponse getStatus() { 
     return status; 
    } 
    public JsonElement getJsonapi() { 
     return jsonapi; 
    } 
    public String getMessage() { 
     return message; 
    } 
    public JsonElement getData() { 
     return data; 
    } 

} 

Comme vous pouvez le voir je stocke actuellement la valeur de jsonapi comme JsonElement. Cela signifie que lorsque j'analyse la valeur de la json, je me retrouve avec la valeur de la chaîne étant {"version":"1.0"}.

Mon but est de stocker cette valeur en tant qu'objet sub (?). Et, plutôt que la valeur de l'API est un JsonElement dans SupplierResponseTest, pour qu'il soit un objet ou une énumération. Cependant, je suis coincé sur la façon de faire cela. Le but de cette valeur est de pouvoir effectuer une validation de concombre sur la valeur du nouvel objet, qui serait 1.0, plutôt que d'analyser un tas de json {"version":"1.0"}.

Le concombre J'utilise est:

Scenario Outline: Add Supplier Details 
    Given the system does not know about any Suppliers 
    When the client adds the following <supplier> 
    Then the response status is <status> 
    And the response has the <jsonapi> version 
    And the response has the request <supplier> 

     Examples: 
     | supplier     | status | jsonapi | 
     | "Blue Network Energy LTD" | "SUCCESS" | "1.0"  | 

La définition de l'étape spécifique que je vais avoir des problèmes avec est:

@Then("^the response has the \"([^\"]*)\" version$") 
public void the_response_has_the_version(String arg1) throws Throwable { 

    try{    

     //This returns a string of json... 
     JsonElement apiVersion = supplierResponse.getJsonapi(); 

     //The below attempts to assert the two values "1.0" and {"version":"1.0"} 
     Assert.assertEquals(arg1, apiVersion.toString()); 

    } catch (Exception e){ 
     System.out.println(e.getMessage()); 
    } 


} 

Répondre

0

Ok, je pris la tête de this question.

J'ai créé une nouvelle classe qui couvre l'élément JSON imbriqué:

package json.responses; 
public class ApiVersionResponseTest { 

    private String version; 

    private ApiVersionResponseTest(String version) { 
     this.version = version; 
    } 


    public String getApiVersion() { 
     return version; 
    } 

} 

les constructeurs de classe parent ont été modifiés pour permettre au apiVersion à transmettre et créé comme un nouvel objet:

package json.responses; 
import com.google.gson.JsonElement; 

public class SupplierResponseTest { 

    private StatusResponseTest status; 
    private ApiVersionResponseTest jsonapi; //Relevant change 
    private String message; 
    private JsonElement data; 


    public SupplierResponseTest(StatusResponseTest status, ApiVersionResponseTest jsonapi) { 
     this.status = status; 
     this.jsonapi = jsonapi; 

    } 
    public SupplierResponseTest(StatusResponseTest status, ApiVersionResponseTest jsonapi, String message) { 
     this.status = status; 
     this.jsonapi = jsonapi; 
     this.message = message; 
    } 
    public SupplierResponseTest(StatusResponseTest status, ApiVersionResponseTest jsonapi, JsonElement data) { 
     this.status = status; 
     this.jsonapi = jsonapi; 
     this.data = data; 

    } 
    public StatusResponseTest getStatus() { 
     return status; 
    } 
    public ApiVersionResponseTest getJsonapi() { 
     return jsonapi; 
    } 
    public String getMessage() { 
     return message; 
    } 
    public JsonElement getData() { 
     return data; 
    } 
} 

Et la définition d'étape (fonctionnant maintenant) appelle l'objet imbriqué comme suit:

@Then("^the response has the \"([^\"]*)\" version$") 
public void the_response_has_the_version(String arg1) throws Throwable { 

    try{    

     Assert.assertEquals(arg1, supplierResponse.getJsonapi().getApiVersion()); 

    } catch (Exception e){ 
     System.out.println(e.getMessage()); 
    } 


} 

Bingo bango. Fixé.