2024. 5. 1. 13:39ㆍBackend/Spring
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로 설정해주어야합니다.
정상적으로 직렬화되는 것을 확인할 수 있습니다.