我有简单的集成测试
@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()尝试了一些技巧,但没有任何效果。
你可以调用andReturn()并使用返回的MvcResult对象以获取内容String。
andReturn()
MvcResult
String
见下文:
MvcResult result = mockMvc.perform(post("/api/users").header("Authorization", base64ForTestUser).contentType(MediaType.APPLICATION_JSON) .content("{\"userName\":\"testUserDetails\",\"firstName\":\"xxx\",\"lastName\":\"xxx\",\"password\":\"xxx\"}")) .andDo(MockMvcResultHandlers.print()) .andExpect(status().isBadRequest()) .andReturn(); String content = result.getResponse().getContentAsString(); // do what you will
@Sotirios Delimanolis回答完成了这项工作,但是我一直在寻找在此模拟Mvc断言中比较字符串的方法
所以这是
.andExpect(content().string("\"Username already taken - please try with different username\""));
当然我的主张失败了:
java.lang.AssertionError: Response content expected: <"Username already taken - please try with different username"> but was:<"Something gone wrong">
因为:
MockHttpServletResponse: Body = "Something gone wrong"
因此,这证明它有效!