[Spring Mvc] Post API Test시 HTTP Status 415 발생

Gyuyeon·2022년 4월 23일
0

Spring 문제 해결

목록 보기
2/2

에러 상황

mockMvc 를 통해 Post API Test 시 HTTP Status 415 발생

    @Test
    @DisplayName("유저 추가")
    void save_user() throws Exception {
        //Given
        String testURL = "/api/user";
        UserSaveRequestDto saveUser = new UserSaveRequestDto();
        saveUser.setRole("ROLE_USER");
        saveUser.setUsername("Han");
        saveUser.setLoginId("testuser");
        saveUser.setPassword("testuser");

        String contentBody = objectMapper.writeValueAsString(saveUser);

        //When
        ResultActions resultActions = mockMvc.perform(
                post(testURL)
                        .content(contentBody));

        //Then
        resultActions.andExpect(status().isCreated());
    }

HTTP Status 201(Created)이 아닌 415(Unsupported Media Type)을 반환하여 테스트 실패

java.lang.AssertionError: Status expected:<201> but was:<415>

원인

String contentBody = objectMapper.writeValueAsString(saveUser);

//When
ResultActions resultActions = mockMvc.perform(
	post(testURL)
    	.content(contentBody));

objectMapper를 통해 Json 형태의 텍스트를 Request Body에 실었지만 기본적으로 mockMvc 에서 Header에 Content-Type을 지정하지 않아서 발생

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/user
       Parameters = {}
          Headers = [Content-Length:"80"]
             Body = {"role":"ROLE_USER","username":"Han","loginId":"testuser","password":"testuser"}
    Session Attrs = {}

따라서 Controller에서는 Json이 아닌 일반 텍스트로 인식하고 Controller의 @RequestBody에서 처리할 수 없음

해결 방법

mockMvc Post Test 시 명시적으로 contetType(MediaType.APPLICATION_JSON) 추가

ResultActions resultActions = mockMvc.perform(
                post(testURL)
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(contentBody));

Request Header에도 Content-Type Header가 추가된 것을 확인할 수 있음

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /api/user
       Parameters = {}
          Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"80"]
             Body = {"role":"ROLE_USER","username":"Han","loginId":"testuser","password":"testuser"}
    Session Attrs = {}
profile
공부 중 기록하는 내용으로 혹시 잘못된 내용이 있을 시에는 알려 주시면 감사하겠습니다 😀

0개의 댓글