1. 문제의 상황
이번 문제는 기존의 Json만 전달하면 RestAssured 테스트 코드에서 multiparts를 전달하다 보니 발생한 문제였다.
우선 다음과 같이 (Json데이터 + multipart form data)를 함께 보내려 한다.
이를 받는 컨트롤러는 다음과 같다.
@PostMapping("/api/sessions")
public ResponseEntity<Void> createNewSession(
@RequestPart @Valid SessionRequest request,
@RequestPart List<MultipartFile> files)
{
SessionDto session = toDto(request);
long currentGenerationId = generationService.getActiveGeneration().getId();
sessionService.createSession(session, currentGenerationId);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
Json데이터와 File을 함께 받기 위해서는, Json 부분도 form-data형식으로 함께 보내주어야 하기 때문에 둘 다 @RequestPart를 사용하게 되었다.
PostMan으로 전달할 때는 큰 문제가 없었지만, 테스트를 작성할 때 문제가 생겼다.
내가 처음 생각한 코드는 다음과 같았다.
LocalDateTime now = LocalDateTime.now();
ExtractableResponse<Response> response = RestAssured.given().log().all()
.auth().oauth2(accessToken)
.contentType(MediaType.MULTIPART_FORM_DATA_VALUE)
.multiPart("request", new SessionRequest(1L, ...))
.multiPart("files", file)
.when().post("/api/sessions")
.then().log().all()
.extract();
"request" 라는 key로 SessionRequest 객체를 전달하고, "files"라는 이름으로 file객체를 전달한다.
하지만 이는 다음과 같은 에러가 발생한다.
new SessionRequest 를 역직렬화할 수 없다는 상황이다.
그도 그럴것이 SessionRequest객체의 MediaType을 모르기 때문에 ObjectMapper를 어떤 형식으로 역직렬화해줘야 할지 모른다.
따라서 위와 같은 예외가 발생하게 되는 것 이다.
2. 해결 방법
이를 해결하기 위해서 multiPart()의 3번째 파라미터인 mimeType을 설정해 주는 것이다.
다음과 같이 끝에 SessionRequest를 Json 형식으로 역직렬화하라고 명시해 주면 된다!
.multiPart("request", new SessionRequest(1L, ...), MediaType.APPLICATION_JSON_VALUE)
3. 힌트를 얻은 글
'BackEnd > TDD' 카테고리의 다른 글
SpringBoot에 Test Container적용 (MySQL, Redis) (2) | 2022.12.13 |
---|---|
[TDD] 테스트를 위한 생성자, 메서드 피하는 방법 (2) | 2022.07.26 |
[TDD] JUnit 만들기 - 2 (2) | 2022.07.15 |
[TDD] JUnit 만들기 - 1 (2) | 2022.07.15 |
[junit5] MockMvc에서 NestedServletException 통과시키기 (0) | 2022.03.11 |
댓글