Controller test에서 requestBody 말고 requestPart(multipartFile용) 받아오기

leverest96·2023년 1월 4일
0

Trouble Shooting

목록 보기
9/20
post-thumbnail

문제 인지

controller test 코드를 짜던 도중 requestBody에 포함된 multipartFile을 받아오지 못한다는 것을 발견했다.

문제 원인

우선, multipartFile은 DTO로 받으면 안된다고 한다. 따라서, requestBody가 아닌 requestPart로 따로 받아와야한다고 한다. 또한, multipartFile을 제외한 DTO가 존재한다 하더라도 DTO와 multipartFile 모두 requestPart로 받아와야했다.
또한, 아래의 예시처럼 MockMvcRequestBuilders 이후 지금의 .post가 아닌 .patch의 형식을 사용하면 될 줄 알았지만 multipartFile에 대한 test의 MockMvcRequestBuilders는 기존과 달랐다. 심지어 이 경우 PostMapping이 default라 내가 기획한 PatchMapping에 대한 방법도 만들어야했다.

final ResultActions resultActions = mockMvc.perform(
            MockMvcRequestBuilders.post(ProfileApiUrl.PROFILE_CREATION.getEntireUrl())
                    .content(gson.toJson(requestDto))
                    .contentType(MediaType.APPLICATION_JSON)
);

위 두 경우를 모두 해결해야했다.

해결 방법

우선 multipartFile에 대한 test의 경우 MockMvcRequestBuilders 이후 .post, .get이 아닌 .multipart를 사용해야한다.

final MockMultipartHttpServletRequestBuilder builder = MockMvcRequestBuilders.multipart(url);

final ResultActions resultActions = mockMvc.perform(
    builder.file((MockMultipartFile) requestDto.getPictureFile())
);

추가적으로, @PostMapping이 default이기 때문에 request를 PATCH로 바꿔줘야한다.

final MockMultipartHttpServletRequestBuilder builder = MockMvcRequestBuilders.multipart(url);

builder.with(request -> {
    request.setMethod("PATCH");

    return request;
});

final ResultActions resultActions = mockMvc.perform(
    builder.file((MockMultipartFile) requestDto.getPictureFile())
);

추가적으로 이후 Integration Test에서 Cookie를 추가하고 싶다면 아래의 경우처럼 setCookies 내부에 Cookie를 추가해주면 된다.

final MockMultipartHttpServletRequestBuilder builder = MockMvcRequestBuilders.multipart(url);
  
builder.with(request -> {
    request.setMethod("PATCH");
    request.setCookies(new Cookie(AccessTokenProperties.COOKIE_NAME, accessToken));
    
    return request;
});

final ResultActions resultActions = mockMvc.perform(
    builder.file((MockMultipartFile) requestDto.getPictureFile())
);
profile
응애 난 애기 개발자

0개의 댓글