JUnit测试中ZonedDateTime序列化异常返回Double类型问题咨询
解决Spring Boot单元测试中ZonedDateTime序列化异常问题
问题根因
返回科学计数法格式的Double字符串,是因为单元测试上下文未正确加载Jackson的Java 8时间类型序列化模块,也没有生效日期转ISO字符串的全局配置。
修复步骤
- 第一步:确认引入JSR310时间序列化依赖
Spring Boot 2.x及以上版本默认集成该依赖,自定义依赖管理的项目需显式引入:
<!-- Maven依赖示例 --> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency>
- 第二步:调整测试类注解确保配置加载
如果使用@WebMvcTest做切片测试,默认不会加载全量Jackson自动配置,需要在测试类上加@AutoConfigureJson注解强制加载Jackson配置。
如果是手动构建MockMvc使用standaloneSetup模式,需要手动绑定配置好的Jackson消息转换器:
@Autowired private ObjectMapper objectMapper; // 构建MockMvc时指定消息转换器 mockMvc = MockMvcBuilders.standaloneSetup(customerController) .setMessageConverters(new MappingJackson2HttpMessageConverter(objectMapper)) .build();
- 第三步:校验配置属性正确性
检查application-test.properties中的配置拼写无误:
# 注意属性名的大小写和分隔符 spring.jackson.serialization.write-dates-as-timestamps=false # 可选:显式指定时区和日期格式 spring.jackson.time-zone=Asia/Shanghai spring.jackson.date-format=com.fasterxml.jackson.databind.util.ISO8601DateFormat
如果仅需要个别字段特殊格式化,可在DTO对应字段上加注解兜底:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX") private ZonedDateTime createTime;
- 第四步:兜底配置方案
如果上述配置仍未生效,可在测试类中显式注册ObjectMapper配置:
@TestConfiguration public class JacksonTestConfig { @Bean public ObjectMapper testObjectMapper() { ObjectMapper mapper = new ObjectMapper(); // 注册Java 8时间类型序列化模块 mapper.registerModule(new JavaTimeModule()); // 禁用日期转时间戳 mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return mapper; } }
在测试类上引入该配置即可:@Import(JacksonTestConfig.class)
内容的提问来源于stack exchange,提问作者Taras Sheptitskiy
相关产品推荐
相关产品推荐

