Spring Boot 1.5.8升级至2.0.0后JUnit测试启动失败求助
嘿,我帮你梳理下这个问题——从错误堆栈来看,核心症结是SpringDataWebAutoConfiguration.pageableCustomizer的条件处理出错了,这是Spring Boot 2.0升级时非常典型的兼容性问题,咱们来拆解原因和解决办法:
最可能的几个根本原因
- 依赖版本混乱:Spring Boot 2.0绑定的是Spring Data Kay系列,而1.5.x用的是Ingalls系列。如果你的项目没通过Boot父依赖统一管理版本,手动指定的Spring Data版本大概率和2.0不兼容,直接导致自动配置的条件判断失效。
- 自定义WebMvc配置冲突:要是你项目里有
WebMvcConfigurerAdapter(2.0里这个类已经被废弃)或者自定义的分页参数配置,很可能和SpringDataWebAutoConfiguration的自动逻辑冲突,尤其是分页相关的参数解析器部分。 - 测试上下文初始化逻辑变更:JUnit测试里,Spring Boot 2.0对上下文加载做了调整,虽然
SpringJUnit4ClassRunner还能用,但更推荐用SpringRunner,而且@SpringBootTest的配置属性也有不少变化,旧的测试注解配置可能不兼容。
一步步解决的方案
1. 先把依赖版本掰正
确保你的pom.xml(或build.gradle)继承Spring Boot 2.0.0的父依赖,让它自动帮你管理所有子依赖的版本,避免版本冲突:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> <relativePath/> <!-- 从仓库拉取父依赖,无需本地路径 --> </parent>
然后把所有手动指定的Spring Data、Spring Framework相关依赖的版本号删掉,交给父依赖统一管理。
2. 修复自定义WebMvc配置
如果项目里有用WebMvcConfigurerAdapter,赶紧换成实现WebMvcConfigurer接口(2.0里这个适配器类已被移除):
// 旧的1.5.x代码 public class CustomWebMvcConfig extends WebMvcConfigurerAdapter { // 各种配置方法 } // 新的2.0.x代码 public class CustomWebMvcConfig implements WebMvcConfigurer { // 按需实现配置方法即可,无需全量重写 }
另外,要是你手动注册过PageableHandlerMethodArgumentResolver这类分页相关的解析器,建议删掉,让SpringDataWebAutoConfiguration自动处理,或者用@ConfigurationProperties来配置分页参数,避免冲突。
3. 更新测试类的配置
把测试类里的SpringJUnit4ClassRunner换成SpringRunner(其实是同一个类的别名,更符合2.0规范),同时检查@SpringBootTest的配置是否正确:
@RunWith(SpringRunner.class) @SpringBootTest(classes = YourApplicationMainClass.class) public class YourTestClass { // 测试方法 }
如果是Web相关的测试,还可以加上@AutoConfigureMockMvc,替代旧的测试配置方式。
4. 排查自动配置的详细情况
可以在测试类里加个调试参数,查看自动配置的详细报告:
@SpringBootTest(properties = {"debug=true"})
启动测试后,控制台会输出所有自动配置类的处理情况,找到SpringDataWebAutoConfiguration相关的条件判断结果,就能明确是哪个条件不满足导致的失败,比如是否缺少某个类或者配置属性。
总结
这个问题本质是Spring Boot 2.0对自动配置的条件逻辑做了调整,同时依赖版本和配置类的兼容性有变化,按照上面的步骤逐一排查,应该能快速解决JUnit测试全失败的问题。
内容的提问来源于stack exchange,提问作者Aiswarya Ghosh




