我在spring-data-jpa之上使用spring-data-rest。
我正在编写集成测试,以使用MockMvc和内存测试数据库来测试我的SDR API。
到目前为止,我专注于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 :(得分:2)
我倾向于构建一个代表Json的Map
并将其序列化为一个字符串,而我又将其用作例如JEG的内容。 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 :(得分:1)
Mathias,谢谢你的好主意。
我提出了一种在测试中使用的简单方法:
Array
我这样用:
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());
}