Spring 传统项目中如何正常运行 JUnit 4 测试并解决依赖注入失败问题
问题解决步骤
- 第一步:检查Spring配置文件的扫描范围
你标注了@Service的类未被Spring识别,大概率是两个原因:- root-context.xml配置的组件扫描范围未覆盖POIInfoService所在的
com.plx.smtst.admin包,需要确认配置中存在如下内容:<!-- 需先在xml头部引入context命名空间 --> <context:component-scan base-package="com.plx.smtst.admin, com.plx.smtst.itf" /> - 传统Spring MVC项目常拆分配置:root上下文负责service、dao层Bean,servlet上下文负责controller层Bean,如果你把service层的扫描配置写在了servlet的配置文件中,仅加载root-context.xml就会找不到对应Bean,要么把service扫描移到root-context.xml,要么在测试类的
@ContextConfiguration中引入所有需要的配置文件,示例如下:@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/root-context.xml", "file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml" })
- root-context.xml配置的组件扫描范围未覆盖POIInfoService所在的
- 第二步:修复测试运行时的VM参数生效问题
你在maven-surefire-plugin中配置的argLine仅对mvn test命令行执行测试生效,直接在IDE中运行单元测试时不会读取该配置,两种解决方案:- 手动给测试运行配置加VM参数:IDEA操作路径为 Run → Edit Configurations → 找到对应JUnit测试配置 → VM options 填入
-noverify -Dspring.profiles.active=local -Dfile.encoding=UTF-8,如需全局生效可修改JUnit的默认配置模板。 - 更稳妥的方案:直接在测试类上添加
@ActiveProfiles("local")注解,无需依赖JVM参数传递环境标识,示例如下:@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml") @ActiveProfiles("local") // 新增该行 public class RestApiControllerTest { // 原有代码 }
- 手动给测试运行配置加VM参数:IDEA操作路径为 Run → Edit Configurations → 找到对应JUnit测试配置 → VM options 填入
- 第三步:校验注解导包正确性
确认POIInfoService类上的@Service注解导入的是org.springframework.stereotype.Service,而非其他框架的同名注解。 - 第四步:排查组件扫描日志
如上述步骤仍未解决,可在测试的VM参数中添加-Dlogging.level.org.springframework.context.annotation=DEBUG,运行测试后查看日志,确认Spring组件扫描过程是否命中了POIInfoService类,以及对应Bean未注册的具体原因。
内容的提问来源于stack exchange,提问作者ringhiosi
相关产品推荐
相关产品推荐

