이번 포스트에서는 Junit과 MockMvc를 이용해서 file upload를 테스트하는 방법에 대해서 살펴보자.
file upload test
multipart()
get방식 또는 post 방식의 request를 생성하기 위해서 MockMvcResultBuilders의 get(), post() 메서드를 사용했다면 file upload를 위해서는 multipart()를 사용한다.
multipart()의 반환타입은 MockMultipartHttpServletRequestBuilder 인데 이를 이용해서 file을 등록할 수 있다. 그래도 업로드할 파일은 필요한데 이때는 MockMultipartFile 클래스를 이용한다.
나머지 설정(파라미터, 쿠키 등)은 일반적인 테스트와 동일하다.
@Controller 구성
@PostMapping
public ResponseEntity<CustomerDto> regist(@RequestBody CustomerDto dto,
@RequestParam(required = false) MultipartFile file)
throws IllegalStateException, IOException {
log.debug("dto: {}, file: {}", dto, file);
service.registCustomer(dto, file);
return new ResponseEntity<CustomerDto>(dto, HttpStatus.OK);
}
단위테스트 구성
@Autowired
ResourceLoader loader;
@Autowired
MockMvc mockMvc;
@Test
public void insertTest() throws Exception {
// given
String fileName = "thumb.png";
Resource res = loader.getResource("classpath:/static/images/" + fileName);
MockMultipartFile file = new MockMultipartFile("file", fileName, null, res.getInputStream());
RequestBuilder request = MockMvcRequestBuilders.multipart("/customer/api")
.file(file)
.param("name", "name").param("email", "email@abc.net").param("pass", "1234");
// when
ResultActions actions = mockMvc.perform(request);
// then
actions.andExpect(status().isOk());
}