2

Я использую Spring-data-rest поверх spring-data-jpa.Как создать JSON для интеграционных тестов с пружинным уплотнением данных и MockMvc

Я пишу интеграционные тесты для тестирования моего SDR API с использованием MockMvc и базы данных тестирования в памяти.

До сих пор я сосредоточился на GET, но теперь я ищу создание тестов для запросов POST, PUT и PATCH, и похоже, что мне придется написать собственный генератор JSON (возможно, на основе GSON) чтобы получить такие вещи, как URL-адреса для связанных объектов, например

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

и в моих тестах я бы построить вверх объект с родителем/детьми:

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

должен генерировать JSON как это:

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

Есть функциональные возможности в SDR, что я могу использовать для создания JSON из инициализированных вручную объектов в тестах?

+0

Может быть [Весна Restbucks] (https://github.com/ olivergierke/spring-restbucks) - пример автора SDR может помочь: [MoneySerializationTest] (https://github.com/olivergierke/spring-restbucks/blob/master/src/test/java/org/springsource/restbucks /payment/web/MoneySerializationTest.java) – Cepr0

ответ

2

Я склонен строить Map, которые представляют Json и сериализуют его в строку, которую я, в свою очередь, использую в качестве содержимого, например. POST звонок.

Для удобства я хотел бы использовать guava ImmutableMap, потому что он поставляется с удобной функциональностью строителя.

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)); 

Конечно, вы можете также непосредственно сериализовать экземпляр вашего объекта с `ObjectMapper``

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

Люблю с первой версией, потому что при таком подходе очень четко каком формате JSON Вы отправляете. И вы сразу же осознаете, когда делаете несовместимые изменения.

1

Mathias, спасибо за отличную идею.

я придумал простой метод, который будет использоваться в тестах:

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

я использую это так:

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