MockMvcBuilders.standaloneSetup()에서 LocalDateTime 직렬화 문제 해결 방법

2024. 5. 1. 13:39Backend/Spring

Meta: MockMvcBuilders, standaloneSetup, LocalDateTime, 직렬화, SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, Spring Boot, MockMvc, Jackson, ObjectMapper, 테스트 코드

MockMvcBuilders.standaloneSetup()에서 LocalDateTime 직렬화 문제 해결 방법

RestDocs를 사용하여 MockMvcBuilders.standaloneSetup()으로 구성된 테스트에서 LocalDateTime 직렬화 문제를 해결하는 방법을 소개합니다.


The documented type of the field '{field Name}' is String but the actual type is Array 오류가 발생하여 해결했습니다.

 

RestDocs를 사용할 때, standaloneSetup을 사용하여 MockMvc를 구성하면 전체 스프링 컨텍스트를 로드하지 않고, 특정 컨트롤러만을 테스트할 수 있습니다.

 

ObjectMapper설정을 제대로 해줬음에도 불구하고 Mockito에서 thenReturn으로 stubbing하려하면 LocalDateTime 필드에서 직렬화가 의도한 것처럼 되지 않는 문제가 발생합니다.

 

 

하지만 System.out으로 objectMapper를 테스트해보면 적절하게 직렬화되는 모습을 확인할 수 있었습니다.

 

LocalDateTime이 있는 필드에 @JsonFormat 어노테이션을 사용해도 해결되기는 하겠지만, 프로덕션 코드에서는 정상적으로 작동하는데, 테스트코드로 인해 어노테이션을 추가해야 한다는 것이 비효율적으로 생각되어 이를 해결해보고자 했습니다.

 

MockMvc의 MessageConverter 설정

이는 standaloneSetup을 사용할 때 MockMvc의 MessageConverter에 사용할 ObjectMapper가 Jackson의 기본 ObjectMapper설정이 적용되기 때문으로 이를 명시적으로 설정해주어야 합니다. 

 

따라서 아래와 같이 설정해주면 정상적으로 작동됩니다.

SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 설정

이 설정은 Java의 날짜 및 시간 객체(LocalDateTime, LocalDate, ZonedDateTime 등)를 JSON으로 직렬화할 때 숫자 타임스탬프 형식으로 출력할지 아니면 포맷된 문자열로 출력할지를 결정합니다.

-> true일 경우, Java의 날짜와 시간 객체들은 타임스탬프(예: 1588291200000)로 직렬화합니다

 

이를 false로 설정해주어야합니다. 

 

정상적으로 직렬화되는 것을 확인할 수 있습니다.