У меня простой интеграционный тест
@Test
public void shouldReturnErrorMessageToAdminWhenCreatingUserWithUsedUserName() 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(?);
}
В последней строке я хочу сравнить полученную строку в теле ответа с ожидаемой строкой
И в ответ я получаю:
MockHttpServletResponse:
Status = 400
Error message = null
Headers = {Content-Type=[application/json]}
Content type = application/json
Body = "Username already taken"
Forwarded URL = null
Redirected URL = null
Пробовал некоторые приемы с content (), body (), но ничего не получалось.
java
spring
mocking
spring-test-mvc
pbaranski
источник
источник
"Username already taken"
. Это должно быть больше из 409 конфликта.Ответы:
Вы можете вызвать
andReturn()
и использовать возвращенныйMvcResult
объект, чтобы получить содержимое в видеString
.Увидеть ниже:
источник
@RestController
указывает, что все методы-обработчики неявно помечены@ResponseBody
. Это означает, что Spring будет использовать aHttpMessageConverter
для сериализации возвращаемого значения обработчика и записи его в ответ. Вы можете очень получить тело сcontent()
.getContentAsString()
моим@RestController
аннотированным контроллером.result.getResponse().getErrorMessage()
andReturn
вернутьMvcResult
, как указано в Javadoc здесь .Ответ @Sotirios Delimanolis делает работу, однако я искал сравнение строк в этом утверждении mockMvc
Так вот
Конечно, мое утверждение не удалось:
так как:
Так что это доказательство того, что это работает!
источник
.andExpect(content().string(containsString("\"Username already taken");
org.hamcrest.Matchers.containsString()
.org.hamcrest.Matchers.equalToIgnoringWhiteSpace()
matcher, чтобы игнорировать все символы пробела. Может быть, это будет полезный совет для кого-тоSpring MockMvc теперь имеет прямую поддержку JSON. Итак, вы просто говорите:
и в отличие от сравнения строк, он будет говорить что-то вроде «пропущенное поле xyz» или «сообщение Ожидается, что« ок »получил« nok ».
Этот метод был представлен весной 4.1.
источник
ContentRequestMatchers
ли также поддерживать эту функцию?Читая эти ответы, я вижу многое, касающееся Spring версии 4.x, я использую версию 3.2.0 по разным причинам. Так что такие вещи, как поддержка JSON прямо из,
content()
невозможны.Я обнаружил, что использовать
MockMvcResultMatchers.jsonPath
это действительно легко и работает удовольствие. Вот пример тестирования почтового метода.Преимущество этого решения в том, что вы по-прежнему сопоставляете атрибуты, не полагаясь на полное сравнение строк json.
(Используя
org.springframework.test.web.servlet.result.MockMvcResultMatchers
)Тело запроса было просто строкой json, которую вы можете легко загрузить из реального файла данных json, если хотите, но я не включил это здесь, поскольку это отклонилось бы от вопроса.
Фактическое возвращение JSON выглядело бы так:
источник
Взято из весеннего урока
is
доступно изimport static org.hamcrest.Matchers.*;
jsonPath
доступно изimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
и
jsonPath
ссылку можно найти здесьисточник
error: incompatible types: RequestMatcher cannot be converted to ResultMatcher
за.andExpect(content().contentType(contentType))
Spring Security
@WithMockUser
и HamcrestcontainsString
соответствуют простому и элегантному решению:Больше примеров на github
источник
Вот пример того, как проанализировать ответ JSON и даже как отправить запрос с bean-компонентом в форме JSON:
Как вы можете видеть здесь
Book
это DTO запроса, аUpdateBookResponse
объект ответа анализируется из JSON. Вы можете изменитьObjectMapper
конфигурацию Jakson .источник
Это должно дать вам тело ответа. «Имя пользователя уже занято» в вашем случае.
источник
здесь более элегантный способ
источник
Вы можете использовать метод getContentAsString, чтобы получить данные ответа в виде строки.
Вы можете обратиться по этой ссылке для тестирования приложения.
источник
Один из возможных подходов - просто включить
gson
зависимость:и проанализируйте значение, чтобы сделать ваши проверки:
источник