Используя Spring mockMvc, как мне проверить, содержат ли возвращаемые данные часть строки?

Я использую 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».


person Dave    schedule 17.05.2016    source источник


Ответы (3)


Похоже, вы можете передать Hamcrest Matcher вместо строки. Должно быть что-то вроде:

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

Более подходящий способ сделать это:

mockMvc.perform(get("/api/users/" + id))
    .andExpect(status().isOk())
    .andExpect(jsonPath("$.id", org.hamcrest.Matchers.is(id)));
person Jean-Christophe    schedule 13.11.2018

Другой способ получить ответ String на запрос mockMVC, чтобы вы могли сравнивать или манипулировать им другими способами, заключается в следующем:

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

Вы также можете обернуть все это в assertTrue, все еще используя методы String:

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

Я предпочитаю утвержденный ответ, просто подумал, что представлю это как еще одну альтернативу.

person Matt Trax    schedule 22.05.2017