BackEnd/TDD

[RestAssured] Multiparts 테스트 작성시 Json데이터와 File을 함께 보내기 (Cannot serialize because cannot determine how to serialize content-type multipart/form-data)

샤아이인 2023. 2. 28.

 

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. 힌트를 얻은 글

https://stackoverflow.com/questions/69463599/rest-assured-multiparts-param-not-getting-cleared-when-running-a-different-a

 

Rest Assured - "Multiparts" param not getting cleared when running a different API Call

I have a feature file with multiple scenarios (GET,POST etc.). There is one particular order where - Scenario 1 - POST Request is run with "multipart" data Scenario 2 - GET Request needs...

stackoverflow.com

 

댓글