[ERROR] @SpringBootTest MockMvc post content null
- ERROR
- 2020. 9. 14.
반응형
1. 문제
@SpringBootTest에서 MockMvc를 사용해 post Rest API를 테스트할때, content로 넘겨준 Json 값이 Object로 convert 되지 않고 null로 넘어온다.
2. 원인
SpringBoot2에서는 @RequestBody를 따로 명시하지 않아도 알아서 object mapping 을 해줘서, 아래의 API는 실제로는 잘 작동한다.
POST API
@PostMapping("/user/me/update")
@PreAuthorize("hasRole('USER')")
public Long updateUser(UserUpdateRequestDto requestDto, @CurrentUser UserPrincipal userPrincipal) throws IOException {
// update
userService.updateUser(requestDto, userPrincipal);
return userPrincipal.getId();
}
하지만.. @SpringBootTest에서는 mapping 할 object를 제대로 찾지 못하는 것 같다.
2020-03-20 😅
문제의 원인을 찾았다..
UserUpdateRequestDto는 JSON RequestBody가 아닌 Multipart/Form-Data 이다. 따라서 값을 JSON으로 convert 하는게 아닌, Multipart/Form-Data 형태로 데이터를 넘겨야한다.
3. 해결
직접 @RequestBody를 메서드에 명시한다.
POST API
@PostMapping("/user/me/update")
@PreAuthorize("hasRole('USER')")
public Long updateUser(@RequestBody UserUpdateRequestDto requestDto, @CurrentUser UserPrincipal userPrincipal) throws IOException {
// update
userService.updateUser(requestDto, userPrincipal);
return userPrincipal.getId();
}
2020-03-20 😅
해결방법은 아래와 같이 Test code 에서 multipart로 data를 보내면 된다.
private ResultActions postRequest(UserUpdateRequestDto requestDto, UserPrincipal userPrincipal) throws Exception {
final MockMultipartFile file = new MockMultipartFile("file","file.jpg","multipart/form-data",new FileInputStream("C:/portfolio/daily-mission/src/test/resources/로고.jpg"));
return mvc.perform(
multipart("/user/me/update")
.file(file)
.param("id", requestDto.getId().toString())
.param("userName",requestDto.getUserName())
.with(user(userPrincipal)))
.andDo(print());
}
추천서적
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
반응형