How to check String in response body with mockMvc

后端 未结 12 1850
遇见更好的自我
遇见更好的自我 2020-12-02 04:02

I have simple integration test

@Test
public void shouldReturnErrorMessageToAdminWhenCreatingUserWithUsedUserName()          


        
相关标签:
12条回答
  • 2020-12-02 04:36

    @Sotirios Delimanolis answer do the job however I was looking for comparing strings within this mockMvc assertion

    So here it is

    .andExpect(content().string("\"Username already taken - please try with different username\""));
    

    Of course my assertion fail:

    java.lang.AssertionError: Response content expected:
    <"Username already taken - please try with different username"> but was:<"Something gone wrong">
    

    because:

      MockHttpServletResponse:
                Body = "Something gone wrong"
    

    So this is proof that it works!

    0 讨论(0)
  • 2020-12-02 04:37

    You can call andReturn() and use the returned MvcResult object to get the content as a String.

    See below:

    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 
    
    0 讨论(0)
  • 2020-12-02 04:38

    Taken from spring's tutorial

    mockMvc.perform(get("/" + userName + "/bookmarks/" 
        + this.bookmarkList.get(0).getId()))
        .andExpect(status().isOk())
        .andExpect(content().contentType(contentType))
        .andExpect(jsonPath("$.id", is(this.bookmarkList.get(0).getId().intValue())))
        .andExpect(jsonPath("$.uri", is("http://bookmark.com/1/" + userName)))
        .andExpect(jsonPath("$.description", is("A description")));
    

    is is available from import static org.hamcrest.Matchers.*;

    jsonPath is available from import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;

    and jsonPath reference can be found here

    0 讨论(0)
  • 2020-12-02 04:39

    One possible approach is to simply include gson dependency:

    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
    </dependency>
    

    and parse the value to make your verifications:

    @RunWith(SpringRunner.class)
    @WebMvcTest(HelloController.class)
    public class HelloControllerTest {
    
        @Autowired
        private MockMvc mockMvc;
    
        @MockBean
        private HelloService helloService;
    
        @Before
        public void before() {
            Mockito.when(helloService.message()).thenReturn("hello world!");
        }
    
        @Test
        public void testMessage() throws Exception {
            MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/"))
                    .andExpect(status().isOk())
                    .andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON_VALUE))
                    .andReturn();
    
            String responseBody = mvcResult.getResponse().getContentAsString();
            ResponseDto responseDto
                    = new Gson().fromJson(responseBody, ResponseDto.class);
            Assertions.assertThat(responseDto.message).isEqualTo("hello world!");
        }
    }
    
    0 讨论(0)
  • Spring MockMvc now has direct support for JSON. So you just say:

    .andExpect(content().json("{'message':'ok'}"));
    

    and unlike string comparison, it will say something like "missing field xyz" or "message Expected 'ok' got 'nok'.

    This method was introduced in Spring 4.1.

    0 讨论(0)
  • 2020-12-02 04:43

    Spring security's @WithMockUser and hamcrest's containsString matcher makes for a simple and elegant solution:

    @Test
    @WithMockUser(roles = "USER")
    public void loginWithRoleUserThenExpectUserSpecificContent() throws Exception {
        mockMvc.perform(get("/index"))
                .andExpect(status().isOk())
                .andExpect(content().string(containsString("This content is only shown to users.")));
    }
    

    More examples on github

    0 讨论(0)
提交回复
热议问题