为什么@Scheduled在Spring Boot应用正常运行但@SpringBootTest中不执行
问题排查与解决
结论
@Scheduled方法在测试环境不执行的问题和JUnit版本无关,是Spring Boot测试默认的包扫描规则导致的。
根因说明
@SpringBootTest注解默认只会扫描当前测试类所在包及其子包下的配置:
- 你的测试类存放在
com.itsedo.test包下 - 标注了
@EnableScheduling调度开启注解的启动类存放在com.itsedo包下
测试上下文启动时没有扫描到启动类的调度配置,不会初始化定时任务,因此你的调度方法从未执行。
修复方案
任选以下一种方式即可解决问题:
- 方式1:显式指定测试加载的启动类,让上下文正确读取调度配置
修改测试类的@SpringBootTest注解:
@SpringBootTest(classes = BootApplication.class)
- 方式2:调整测试类的存放路径,将
ScheduledTasksTest.java移动到com.itsedo包下,和启动类同包,即可触发自动扫描加载调度配置。
补充说明
你现有的测试逻辑没有问题:使用awaitility等待10秒,验证5秒执行一次的任务至少触发2次,只要调度配置被正确加载,测试就可以正常通过。
内容的提问来源于stack exchange,提问作者Constantine Lee
相关产品推荐
相关产品推荐

