본문 바로가기

STUDY/Spring

JUnit5 | multipart/formdata 전송 테스트 ( MockMultipartFile, @RequsetPart )

MockMultipartFile로 파일 업로드 POST 요청 테스트를 해보자!

1. TestClass 작성

보통 테스트할 클래스 명에 Test를 붙여 생성한다.

  • @SpringBootTest를 이용한 통합테스트를 진행할 것임
  • @AutoConfigureMockMvc를 이용해 MockMvc 자동 설정
  • 스프링 프로필을 설정해놓았다면, @ActiveProfiles로 사용하고자 하는 프로필을 꼭 명시할 것
  • @BeforeEach로 테스트 메서드 요청 전에 access_token을 발급 받아 초기화 함 -> OAuth2를 사용하는 경우에만 해당
@Slf4j
@SpringBootTest
@AutoConfigureMockMvc
@ActiveProfiles(profiles = "local")
public class ImageControllerTest {

    @Autowired
    private MockMvc mvc;

    private String access_token;

    @BeforeEach
    public void getAccessToken() throws Exception {
        String clientId = "";
        String clientSecret = "";
        String username = "";
        String password = "";

        ResultActions perform = this.mvc.perform(post("/oauth/token")
                                                    .with(httpBasic(clientId, clientSecret))
                                                    .param("username", username)
                                                    .param("password", password)
                                                    .param("grant_type", "password"));

        this.access_token = (String) new Jackson2JsonParser().parseMap(perform.andReturn().getResponse().getContentAsString()).get("access_token");
    }

}

2. 이미지 업로드 테스트 메서드 작성

2-1. MockMultipartFile을 생성한다

MockMulipartFile은 MultipartFile 인터페이스를 상속받아 모의 구현한다.
멀티파트파일을 업로드하는 컨트롤러 테스트에 사용된다.

 

생성방법은 아래와 같다.

MockMultipartFile(String name, String originalFilename, String contentType, InputStream contentStream)

 

실제 컨트롤러에서 @RequsetPart로 값들을 받고 있는데, 파일은 image라는 이름으로 받고 있다.

@PostMapping(value = "", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public ResponseEntity<?> uploadImage(Authentication authentication,
                                     @RequestPart(name = "id", required = false) String id,
                                     @RequestPart(name = "image") MultipartFile image) throws IOException {

 

그래서 name을 image로 설정하고, contentType은 image/png로 설정.
FileInputStream으로 실제 컴퓨터에 저장되어 있는 이미지를 불러온다.

MockMultipartFile file = new MockMultipartFile("image",
                                                "test.png",
                                                "image/png",
                                                new FileInputStream("업로드 할 실제 파일 path 입력"));

2-2. MockMvc를 이용해 요청

perform.post()가 아닌 perform.multipart()로 요청한다.
그리고 part()id값을 함께 요청 -> param으로 보내면 @RequestPart로 인식되지 않으므로, 꼭 part로 보내야 한다.

multipart()는 MockMultipartHttpServletRequestBuilder를생성한다.
fileUpload()는 더 이상 사용하지 않음

 

this.mvc.perform(
        multipart("/images")
        .file(file).part(new MockPart("id", "foo".getBytes(StandardCharsets.UTF_8)))
        .header(HttpHeaders.AUTHORIZATION, "Bearer " + this.access_token))
        .andDo(print())
        .andExpect(status().isOk());