본문 바로가기
TEST

@RequestPart MultipartFile , Json 컨트롤러 통합 테스트

by YoonJong 2023. 1. 7.
728x90

프로젝트 중 상품 등록 컨트롤러를 통합테스트 하는 과정에서 오랜시간 동안 테스트 실패로 시간을 투자했다.

 

아무리 구글링을 해도 지금 나와 맞는 조건에서 진행한 테스트 코드가 보이지 않아 최대한 응용을 해보고 계속해서 테스트를 돌려보는 수밖에 없었다.

 

먼저 상품 등록 컨트롤러는 아래와 같다.

상품 등록 시, 상품에 관련된 내용과 상품 이미지를 같이 입력받아 저장해야 한다.

상품 등록에 관한 정보는 JSON 데이터지만 상품 이미지는 이미지로 form -data 타입으로 넣어주어야 한다.

POSTMAN 에서 등록하는 과정

@PostMapping(value = "/goods")
@ResponseStatus(HttpStatus.CREATED)
@PreAuthorize("hasAnyRole('SELLER')")
@ApiOperation(value = "상품 등록")
public void goodsCreate(@RequestPart @Valid GoodsCreateRequest goodsCreateRequest,
                        @RequestPart List<MultipartFile> multipartFiles) throws IOException {

    goodsService.goodsCreate(goodsCreateRequest, multipartFiles);
}

 

@Test
@WithMockUser(roles = "SELLER")
@DisplayName("상품 등록")
void goodsCreate() throws Exception {
    ...
    MockMultipartFile multipartFile = new MockMultipartFile("multipartFiles", "스크린샷_20221219_050536.jpeg", "image/jpeg", "스크린샷_20221219_050536.jpeg".getBytes());
    String content = objectMapper.writeValueAsString(goodsCreateRequest);

    MockMultipartFile json = new MockMultipartFile("goodsCreateRequest", "goodsCreateRequest", "application/json", content.getBytes(StandardCharsets.UTF_8));

    //when
    mockMvc.perform(multipart("/api/goods")
                    .file(json)
                    .file(multipartFile)
                    .contentType(MULTIPART_MIXED_VALUE)
                    .characterEncoding(StandardCharsets.UTF_8)
            .with(user("loginId").roles("SELLER")))
            .andExpect(status().isCreated());

    //then
    assertThat(goodsRepository.findAll().size()).isEqualTo(2);

}

 

이미지는 MockMultipartFile 을 사용해 만들어주어야 한다.

name 값에는 매개변수의 이름이 그대로 와야한다 ( 만약 name() 메서드를 사용했다면 name 안에 있는 이름으로 입력 )

 

타 블로그에서는 originalFilename 과 contentType 을 text/plain 으로 진행을 했다.

나는 그렇게 진행하면 내가 지정한 이미지 파일의 형식이 맞지 않는다는 에러가 발생했다.

png , jpeg 등 이미지 파일 형식만 등록될 수 있게 설정해놓았다.

 

 

상품에 관련된 정보(이미지 외) 는  objectMapper 를 통해 String 타입으로 변환후

이미지와 같은 MockMultipartFile 을 통해 MockMultipartFile 타입으로 생성해주어야 한다.

name 값은 컨트롤러에서 설정한 매개변수이름 그대로 와야하며, contentType 은 application/json 으로 설정해야 한다.

 

 

이제 mockMvc 로 테스트를 해야하는데, 일반 post 가 아닌 multipart 를 사용한다.

지금까지 만든 객체를 file 메서드를 사용해 넣어준다

가장 머리아팠던 부분이 contentType 이었는데, 서로 다른 contentType 을 넣어주려면 어떻게 설정해야하는지 몰라 많이 해맸다.

결론은 MULTIPART_MIXED_VALUE 을 사용해야하는데, 찾아보니 서로다른 유형을 혼합으로 써야할 때 사용한다고 한다.

참고 : https://learn.microsoft.com/en-us/exchange/troubleshoot/administration/multipart-mixed-mime-message-format

 

728x90

댓글