Одной из распространенных задач при создании интеграционных тестов на языке Java с использованием библиотеки Spring MVC Test (mockMvc) является проверка того, что строка в теле ответа соответствует ожидаемой.
Рассмотрим простой пример:
@Test public void shouldReturnErrorMessageWhenCreatingUserWithUsedUserName() throws Exception { mockMvc.perform(post("/api/users").header("Authorization", base64ForTestUser).contentType(MediaType.APPLICATION_JSON) .content("{\"userName\":\"testUserDetails\",\"firstName\":\"xxx\",\"lastName\":\"xxx\",\"password\":\"xxx\"}")) .andDo(print()) .andExpect(status().isBadRequest()) .andExpect(?); }
В данном случае, мы хотим проверить, что полученная в теле ответа строка соответствует ожидаемому значению. Как это сделать?
В mockMvc есть метод content()
, который позволяет проверить тело ответа.
Но что делать, если этот метод не работает или не дает ожидаемого результата?
Один из способов решения этой проблемы — использование jsonPath
. Этот метод позволяет проверять содержимое JSON ответа с использованием выражений JSONPath. Например:
.andExpect(jsonPath("$.message").value("Username already taken"))
Здесь $.message
— это выражение JSONPath, которое указывает на поле message
в JSON-объекте, а "Username already taken"
— это ожидаемое значение этого поля.
Если ответ не в формате JSON, можно использовать метод content()
с матчером String
из библиотеки Hamcrest, который предоставляет множество методов для проверки строк:
.andExpect(content().string("Username already taken"))
Этот код проверяет, что тело ответа точно соответствует строке "Username already taken"
.
Важно помнить, что метод content()
проверяет точное соответствие, а не наличие подстроки в ответе. Если вам нужно проверить наличие подстроки в ответе, вы можете использовать метод containsString()
из Hamcrest:
.andExpect(content().string(containsString("Username already taken")))
Таким образом, с помощью mockMvc и Hamcrest можно эффективно проверять строки в теле ответа при написании интеграционных тестов в Spring MVC.
Добавить комментарий