如何直接从Spring Test MvcResult json响应中检索数据?

时间:2018-11-26 18:06:37

标签: spring spring-mvc spring-test spring-test-mvc

我想从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检索值进行匹配?

3 个答案:

答案 0 :(得分:5)

使用Jayway中的JsonPath,我发现了一种更优雅的方式:

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

答案 1 :(得分:2)

不,不幸的是,没有办法更优雅地做到这一点。但是,您可以使用content().json()来进行类似.andExpect(content().json("{'name': 'name'}"))的检查,也可以添加所有必需的.andExpect()调用,这对于弹簧测试而言将更加自然。

答案 2 :(得分:1)

另一种方法是使用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))))
);