SpringBoot JUnit5单元测试不启动全应用时@Autowired注入报错解决
报错核心原因
无参数的@SpringJUnitConfig不会自动触发Spring组件扫描,测试上下文启动时根本没有注册Demo类对应的Bean,因此抛出NoSuchBeanDefinitionException依赖注入失败异常。
解决方案(均不启动完整Spring Boot应用上下文)
方案1:直接指定注册测试所需Bean(最优,启动速度最快)
如果Demo类没有额外的复杂依赖,直接在@SpringJUnitConfig注解的classes属性中指定要加载的Bean类即可,Spring会自动将其实例化注册到测试上下文,不需要额外扫描配置:
// 仅修改测试类上的注解即可,其余代码不变 @SpringJUnitConfig(classes = Demo.class) class DemoTest { @Autowired private Demo sut; @Test void Test() { Assertions.assertEquals("hello", sut.get()); } }
这种方式只会加载你显式指定的Bean,上下文初始化速度极快,适合单组件的单元测试场景。
方案2:指定有限范围的组件扫描
如果测试需要加载同包下多个@Component/@Service等标记的组件,可以编写一个极简的测试配置类,仅指定需要扫描的包路径,不会触发Spring Boot全量自动配置:
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; @SpringJUnitConfig(classes = DemoTest.TestConfig.class) class DemoTest { // 测试专用配置类,不需要单独建文件 @Configuration @ComponentScan(basePackages = "com.example.demo") // 按需缩小扫描范围,不要扫全工程 static class TestConfig {} @Autowired private Demo sut; @Test void Test() { Assertions.assertEquals("hello", sut.get()); } }
注意事项
- 不要使用无参
@SpringJUnitConfig,它默认不会扫描任何包下的注解标记组件,仅会加载你显式传入的配置类/Bean。 - 以上两种方案都不会启动Spring Boot的完整自动配置链路(不会加载数据源、Web容器等全局自动配置Bean),启动速度远快于
@SpringBootTest,符合轻量单元测试的要求。
内容的提问来源于stack exchange,提问作者vivi
相关产品推荐
相关产品推荐

