You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot 1.5.8升级至2.0.0后JUnit测试启动失败求助

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

火山引擎 最新活动