Spring JsonTest自动配置失败:模型序列化切片测试求助
嘿,我之前也碰到过类似的坑,结合你的情况来看,大概率是依赖配置出了问题——要么是冗余依赖导致版本冲突,要么是Jackson组件不全。下面给你一步步梳理解决方案:
问题根源分析
你用的是Spring Boot 2.0.0.RELEASE,这个版本的spring-boot-starter-test其实已经通过spring-boot-starter-json间接引入了完整的Jackson套件(包括core、databind、annotations这些核心组件)。而你单独引入了jackson-core,如果版本和Spring Boot默认的不一致,就会导致自动配置时出现组件缺失或者版本冲突,进而让@JsonTest无法正常工作。
具体解决步骤
1. 先删掉冗余的Jackson依赖
首先把单独的jackson-core依赖删掉,完全依赖Spring Boot starter的依赖管理,避免版本冲突:
<!-- 移除这个单独引入的依赖 --> <!-- <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2....</version> </dependency> -->
2. 确保@JsonTest的正确写法
你的测试类要正确使用@JsonTest注解,并且通过JacksonTester来测试序列化/反序列化,给你一个示例代码:
import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.json.JsonTest; import org.springframework.beans.factory.annotation.Autowired; import static org.assertj.core.api.Assertions.assertThat; @JsonTest public class UserModelJsonTest { // 自动注入对应模型的JacksonTester @Autowired private JacksonTester<UserModel> jacksonTester; @Test void testUserModelSerialization() throws Exception { // 构造测试用的模型对象 UserModel user = new UserModel("张三", 25); // 序列化后验证JSON内容 String jsonResult = jacksonTester.write(user).getJson(); assertThat(jsonResult).contains("\"username\":\"张三\""); assertThat(jsonResult).contains("\"age\":25"); } @Test void testUserModelDeserialization() throws Exception { // 模拟前端传入的JSON字符串 String testJson = "{\"username\":\"张三\",\"age\":25}"; // 反序列化后验证对象属性 UserModel user = jacksonTester.parseObject(testJson); assertThat(user.getUsername()).isEqualTo("张三"); assertThat(user.getAge()).isEqualTo(25); } }
3. 若必须手动引入Jackson,保证版本兼容
如果你因为某些原因一定要单独引入Jackson组件,必须使用和Spring Boot 2.0.0.RELEASE匹配的版本——这个版本对应的Jackson是2.9.6,所以依赖要这么写:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.6</version> </dependency>
不过还是建议尽量用Spring Boot的依赖管理,不要手动指定版本,省心又避免冲突。
4. 排查并排除冲突依赖
如果你的项目里还有其他依赖引入了Jackson(比如某些第三方SDK),可能会导致版本冲突。这种情况下,可以在spring-boot-starter-test里排除掉冲突的Jackson组件:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>2.0.0.RELEASE</version> <scope>test</scope> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> </exclusion> </exclusions> </dependency>
小提示
@JsonTest会自动帮你配置好ObjectMapper、JacksonTester这些核心组件,不用自己手动实例化- 如果你的模型用了自定义Jackson注解(比如
@JsonProperty重命名字段、@JsonIgnore忽略字段),@JsonTest会自动识别这些配置,不用额外处理 - 要是你有自定义的Jackson配置类(比如全局序列化规则),可以通过
@Import把它加到测试类里,测试自定义规则下的序列化效果
内容的提问来源于stack exchange,提问作者Maaaatt

