[ERROR] @SpringBootTest MockMvc post content null

반응형

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());
    }

추천서적

 

스프링 부트와 AWS로 혼자 구현하는 웹 서비스

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

댓글

Designed by JB FACTORY