如何直接从 Spring test MvcResult json 响应中检索数据?
How to retrieve data directly from Spring test MvcResult json response?
我想从 json 响应中检索一个值,以便在我的其余测试用例中使用,这就是我现在正在做的事情:
MvcResult mvcResult = super.mockMvc.perform(get("url").accept(MediaType.APPLICATION_JSON).headers(basicAuthHeaders()))
.andExpect(status().isOk())
.andExpect(jsonPath("$[0].id", is(6))).andReturn();
String responseAsString = mvcResult.getResponse().getContentAsString();
ObjectMapper objectMapper = new ObjectMapper(); // com.fasterxml.jackson.databind.ObjectMapper
MyResponse myResponse = objectMapper.readValue(responseAsString, MyResponse.class);
if(myResponse.getName().equals("name")) {
//
//
}
我想知道是否有更优雅的方法直接从 MvcResult
检索值,就像 jsonPath
的情况一样进行匹配?
不,不幸的是没有办法更优雅地做到这一点。但是,您可以使用 content().json()
进行 .andExpect(content().json("{'name': 'name'}"))
之类的检查或添加所有必需的 .andExpect()
调用,这对于 spring 测试来说会更自然。
我找到了一种更优雅的方法,使用 JsonPath
of Jayway:
MvcResult mvcResult = super.mockMvc.perform(get("url").accept(MediaType.APPLICATION_JSON).headers(basicAuthHeaders()))
.andExpect(status().isOk())
.andExpect(jsonPath("$[0].id", is(6))).andReturn();
String response = mvcResult.getResponse().getContentAsString();
Integer id = JsonPath.parse(response).read("$[0].id");
另一种方法是 https://github.com/lukas-krecan/JsonUnit#spring
import static net.javacrumbs.jsonunit.spring.JsonUnitResultMatchers.json;
...
this.mockMvc.perform(get("/sample").andExpect(
json().isEqualTo("{\"result\":{\"string\":\"stringValue\", \"array\":[1, 2, 3],\"decimal\":1.00001}}")
);
this.mockMvc.perform(get("/sample").andExpect(
json().node("result.string2").isAbsent()
);
this.mockMvc.perform(get("/sample").andExpect(
json().node("result.array").when(Option.IGNORING_ARRAY_ORDER).isEqualTo(new int[]{3, 2, 1})
);
this.mockMvc.perform(get("/sample").andExpect(
json().node("result.array").matches(everyItem(lessThanOrEqualTo(valueOf(4))))
);
public <E> E getResultList(MvcResult result, Class<E> type) {
E listFromResponse;
try {
String content = result.getResponse().getContentAsString();
ObjectMapper objectMapper = new ObjectMapper();
listFromResponse = objectMapper.readValue(content, type);
return listFromResponse;
} catch (UnsupportedEncodingException | JsonProcessingException e) {
log.error(e.getLocalizedMessage());
}
return (E) Optional.empty();
}
List<SomeDto> resultList = (List<SomeDto>) getResultList(mvcResult, Iterable.class);
我想从 json 响应中检索一个值,以便在我的其余测试用例中使用,这就是我现在正在做的事情:
MvcResult mvcResult = super.mockMvc.perform(get("url").accept(MediaType.APPLICATION_JSON).headers(basicAuthHeaders()))
.andExpect(status().isOk())
.andExpect(jsonPath("$[0].id", is(6))).andReturn();
String responseAsString = mvcResult.getResponse().getContentAsString();
ObjectMapper objectMapper = new ObjectMapper(); // com.fasterxml.jackson.databind.ObjectMapper
MyResponse myResponse = objectMapper.readValue(responseAsString, MyResponse.class);
if(myResponse.getName().equals("name")) {
//
//
}
我想知道是否有更优雅的方法直接从 MvcResult
检索值,就像 jsonPath
的情况一样进行匹配?
不,不幸的是没有办法更优雅地做到这一点。但是,您可以使用 content().json()
进行 .andExpect(content().json("{'name': 'name'}"))
之类的检查或添加所有必需的 .andExpect()
调用,这对于 spring 测试来说会更自然。
我找到了一种更优雅的方法,使用 JsonPath
of Jayway:
MvcResult mvcResult = super.mockMvc.perform(get("url").accept(MediaType.APPLICATION_JSON).headers(basicAuthHeaders()))
.andExpect(status().isOk())
.andExpect(jsonPath("$[0].id", is(6))).andReturn();
String response = mvcResult.getResponse().getContentAsString();
Integer id = JsonPath.parse(response).read("$[0].id");
另一种方法是 https://github.com/lukas-krecan/JsonUnit#spring
import static net.javacrumbs.jsonunit.spring.JsonUnitResultMatchers.json;
...
this.mockMvc.perform(get("/sample").andExpect(
json().isEqualTo("{\"result\":{\"string\":\"stringValue\", \"array\":[1, 2, 3],\"decimal\":1.00001}}")
);
this.mockMvc.perform(get("/sample").andExpect(
json().node("result.string2").isAbsent()
);
this.mockMvc.perform(get("/sample").andExpect(
json().node("result.array").when(Option.IGNORING_ARRAY_ORDER).isEqualTo(new int[]{3, 2, 1})
);
this.mockMvc.perform(get("/sample").andExpect(
json().node("result.array").matches(everyItem(lessThanOrEqualTo(valueOf(4))))
);
public <E> E getResultList(MvcResult result, Class<E> type) {
E listFromResponse;
try {
String content = result.getResponse().getContentAsString();
ObjectMapper objectMapper = new ObjectMapper();
listFromResponse = objectMapper.readValue(content, type);
return listFromResponse;
} catch (UnsupportedEncodingException | JsonProcessingException e) {
log.error(e.getLocalizedMessage());
}
return (E) Optional.empty();
}
List<SomeDto> resultList = (List<SomeDto>) getResultList(mvcResult, Iterable.class);