使用 Spring 的 mockMvc,如何检查返回的数据是否包含字符串的一部分?

Using Spring's mockMvc, how do I check if the returned data contains part of a string?

我正在使用 Spring 3.2.11.RELEASE 和 JUnit 4.11。使用 Spring mockMvc 框架,如何检查返回 JSON 数据的方法是否包含特定的 JSON 元素?我有

    mockMvc.perform(get("/api/users/" + id))
        .andExpect(status().isOk())
        .andExpect(content().string("{\"id\":\"" + id + "\"}")); 

但这会检查返回的字符串是否完全匹配,我宁愿检查 JSON 字符串是否包含我的本地字段“id”所包含的值。

看起来你可以传递一个 Hamcrest Matcher 而不是一个字符串。应该是这样的:

mockMvc.perform(get("/api/users/" + id))
    .andExpect(status().isOk())
    .andExpect(content().string(org.hamcrest.Matchers.containsString("{\"id\":\"" + id + "\"}"))); 

获取 mockMVC 请求的字符串响应的另一种方法如下:

MvcResult result = mockMvc.perform(get("/api/users/" + id))
    .andExpect(status().isOk())
    .andReturn();
String stringResult = result.getResponse().getContentAsString();
boolean doesContain = stringResult.contains("{\"id\":\"" + id + "\"}");

您还可以在仍然使用 String 方法的同时将整个内容包装在 assertTrue 中:

assertTrue(mockMvc.perform(get("/api/users/" + id))
    .andExpect(status().isOk())
    .andReturn()
    .getResponse()
    .getContentAsString()
    .contains("{\"id\":\"" + id + "\"}");

我更喜欢已批准的答案,只是想我会提交这个作为另一种选择。

更合适的方法是:

mockMvc.perform(get("/api/users/" + id))
    .andExpect(status().isOk())
    .andExpect(jsonPath("$.id", org.hamcrest.Matchers.is(id)));

我知道已经很多年了,但我仍然希望我的回答对某人有用 =) 当我需要检查响应中的 json 值是否包含一些字符串时,我使用 containsString 方法:

mockMvc.perform(post("/url")
        .contentType(MediaType.APPLICATION_JSON_VALUE)
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.field1").value(value1))
        .andExpect(jsonPath("$.field2", containsString(value2)));