[Spring Boot] MockMvc multipart/form-data로 테스트하기

최지나·2021년 9월 28일
1

Spring

목록 보기
2/2

테스트 코드 강제화 + 보다 더 깔끔한 API 문서 생성을 위해 적용한 Spring REST Docs

처음 세팅도 난관이었지만 이건 테스트 코드 작성 + 문서 코드 작성 조차도 쉽지가 않다.
다들 난이도 있다고 한 이유가 있었음을 실감하는 중.

이번 삽질은 게시글 작성 시에 이미지를 함께 첨부할 일이 있어서, multipart/form-data 폼을 사용할 일이 있었는데 다른 것도 아니고 문서 작성 코드를 쓰는데 너무 삽질을 많이 했다.

1. Spring REST Docs 공식 문서
공식 문서를 참고해서 가상의 MultipartFile 객체는 어렵지 않게 만들 수 있었다.

2. File 객체 외의 추가 파라미터
나는 위의 이미지와 같이 file 객체 외에 다른 파라미터들을 함께 넘기고 싶었다.
그래서 생성한 테스트 코드는 아래와 같다.

3. 테스트 코드 작성

MockMultipartFile image = new MockMultipartFile("files", "imagefile.jpeg", "image/jpeg", "<<jpeg data>>".getBytes());

	mockMvc
		.perform(RestDocumentationRequestBuilders.fileUpload(apiUrl)
			.file(image)
			.param("reqType", "P")
			.param("departure","mvc test departure")
			.param("arrival","mvc test arrival")
			.param("arrivalDate", "2021-10-15")
			.param("title","mvc test title")
			.param("content","mvc test content")
			.flashAttr("write", new PostDto.Write())
			)

MockMultipartFile 생성 시 인자 값은 다음과 같다.
1) file 객체를 받을 Parameter Name (2번의 이미지를 보면 알겠지만, 나는 files라는 key값으로 받고있다)
2) Original File Name
3) MIME TYPE
4) 파일을 구성 데이터

RequestBuilder에서 이미지에 대해서만 .file의 값으로 채웠고, 그 외 다른 파라미터들은 .param 값으로 입력을 했다.

4. 문서 작성 코드 부분

.andDo(document("post/{method-name}",
	requestParameters(
		parameterWithName("reqType").description("요청 타입")
		,parameterWithName("departure").description("출발지")
		,parameterWithName("arrival").description("도착지")
		,parameterWithName("arrivalDate").description("픽업일자")
		,parameterWithName("title").description("제목")
		,parameterWithName("content").description("내용")
	)
	, requestParts(
		partWithName("files").description("첨부 이미지")
	)

1번에서 본 공식 문서 가이드에는 file객체 외에 일반 텍스트 파라미터를 함께 명시해 둔 가이드가 없는데 정말 별거 없다.
그냥 requestParameters에 parameterWithName으로 작성해주면 된다.

file 객체는 part 타입으로 넘어오므로 별도로 표기까지 해주었다.

5. 생성 된 문서
깔끔해.. 너무 조앙...

요청값과 응답값이 맞지 않으면 테스트 자체를 통과하지 못하고, 그렇기 때문에 문서도 변경되지 않는다. 종종 프로젝트 막바지에 추가로 특정 값들이 추가되거나 그런 경우 문서 업데이트가 누락되는 경우도 많은데 그럴 일이 없어서 좋을 것 같다.
그리고 개발하는데 있어서 단위 테스트 코드 작성에도 습관 들일 수 있을 것 같아서 열심히 사용해보려고 한다.

끗.

profile
Front를 하다보면 Back이 하고싶고, Back을 하다보면 Front가 하고싶고.

0개의 댓글