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 = {}