2

J'utilise spring-data-repos au-dessus de spring-data-jpa.Comment créer un JSON pour les tests d'intégration avec spring-data-rest et MockMvc

J'écris des tests d'intégration pour tester mon API SDR en utilisant MockMvc et une base de données de test en mémoire. Jusqu'à présent, je me suis concentré sur les GET, mais maintenant je cherche à créer des tests pour les requêtes POST, PUT et PATCH et il me semble que je vais devoir écrire mon propre générateur JSON (peut-être basé sur GSON) afin d'obtenir des choses comme des URL pour les entités connexes, par exemple

public class ForecastEntity { 
    @RestResource 
    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "UNITID", referencedColumnName = "ID") 
    private UnitEntity unit; 
} 

et dans mes tests, je construire une entité avec les parents/enfants:

ForecastEntity forecast = new ForecastEntity(); 
forecast.setTitle("test-forecast"); 
forecast.setUnit(new UnitEntity("test-unit")); 

devrait générer JSON comme ceci:

{ 
    "title" : "test-forecast", 
    "unit" : "http://localhost/units/test-unit" 
} 

est-il des fonctionnalités en DTS que je peux utiliser pour produire JSON à partir d'entités initialisées manuellement dans les tests?

+0

Peut-être [Spring Restbucks] (https://github.com/ olivergierke/spring-restbucks) - l'exemple de l'auteur de SDR peut aider: [MoneySerializationTest] (https://github.com/olivergierke/spring-restbucks/blob/master/src/test/java/org/springsource/restbucks /payment/web/MoneySerializationTest.java) – Cepr0

Répondre

2

J'ai tendance à construire un Map qui représente le JSON et le sérialiser en une chaîne que j'utilise à son tour comme le contenu de l'exemple. POST appel. Pour plus de commodité, j'aime utiliser la goyave ImmutableMap car elle est dotée d'une fonctionnalité de construction pratique.

String json = new ObjectMapper().writeValueAsString(ImmutableMap.builder() 
    .put("title", "test-forecast") 
    .put("unit", "http://localhost/units/test-unit") 
    .build()); 
mockMvc.perform(patch(someUri) 
    .contentType(APPLICATION_JSON) 
    .content(json)); 

Bien sûr, vous pouvez également sérialiser directement une instance de votre entité avec le `ObjectMapper``

ForecastEntity forecast = new ForecastEntity(); 
forecast.setTitle("test-forecast"); 
forecast.setUnit(new UnitEntity("test-unit")); 
String json = new ObjectMapper().writeValueAsString(forecast) 

J'aime aller avec la première version, car avec cette approche, il est très explicite qui JSON vous envoyez. Et vous réalisez immédiatement quand vous faites des changements incompatibles.

1

Mathias, merci pour la bonne idée.

je suis venu avec une méthode simple pour être utilisé dans les tests:

public static String toJson(String ... args) throws JsonProcessingException { 
    Builder<String, String> builder = ImmutableMap.builder(); 
    for(int i = 0; i < args.length; i+=2){ 
    builder.put(args[i], args[i+1]); 
    } 
    return new ObjectMapper().writeValueAsString(builder.build()); 
} 

Je l'utilise comme ceci:

mockMvc.perform(patch(someUri) 
    .contentType(APPLICATION_JSON) 
    .content(toJson("title", "test-forecast", "unit", "http://localhost/units/test-unit")));