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());
'STUDY > Spring' 카테고리의 다른 글
Spring Boot | OAuth2 Google 로그인 (0) | 2021.06.09 |
---|---|
Spring Boot | REST Docs 적용하기 ( + build failed 해결.. ) (9) | 2021.06.03 |
JUnit5 | Test LifeCycle (0) | 2021.06.01 |
JUnit5 | Controller 테스트 하기 ( + OAuth2 ) (0) | 2021.05.31 |
JUnit5 | @ExtendWith, MockMvc, @TestConstructor (0) | 2021.05.25 |