Spring Boot 3测试报错:无法找到ApplicationParameterManager Bean
问题场景
使用Spring Boot 3开发时,主启动类FlexApplication通过构造函数注入了@Service注解的ApplicationParameterManager,应用本身运行正常,但执行标注了@DataJpaTest的仓库测试类时,抛出以下错误:
Parameter 0 of constructor in com.acme.FlexApplication required a bean
of type 'com.acme.parameter.ApplicationParameterManager' that could
not be found.
相关代码
主启动类与服务类
@EnableTransactionManagement @SpringBootApplication @Slf4j public class FlexApplication{ private final ApplicationParameterManager appParamManager; public FlexApplication(ApplicationParameterManager appParamManager) { this.appParamManager = appParamManager; } @PostConstruct public void init(){ } .... } @Service @Slf4j public class ApplicationParameterManager{ .... }
测试类代码
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE) @DataJpaTest public class ListUserRepositoryTest { @Autowired private ListUserRepository repository; @Test public void getListUserByUserType(){ String typeUser = "CETEST"; Pageable page = Pageable.ofSize(10); Page<ListUser> pageListUser = repository.findAllByTypeUser(typeUser, page); assertThat(pageListUser.getContent().size() > 5 ).isTrue(); } }
问题原因
@DataJpaTest是Spring提供的切片测试注解,它只会自动配置JPA相关的核心组件(比如Repository、EntityManager、事务管理器等),不会扫描加载整个应用的所有Bean。而主启动类FlexApplication作为Spring Boot应用的入口,在测试上下文初始化时会被实例化,但它的构造函数依赖ApplicationParameterManager——这个业务服务Bean不在@DataJpaTest的自动配置范围内,所以测试上下文找不到该Bean,导致报错。
解决方法
方法一:手动导入缺失的Bean
直接在测试类上添加@Import注解,将ApplicationParameterManager引入测试上下文:
@AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE) @DataJpaTest @Import(ApplicationParameterManager.class) public class ListUserRepositoryTest { // 原有测试代码保持不变 }
方法二:分离主启动类的初始化逻辑
如果主启动类中的@PostConstruct方法是依赖ApplicationParameterManager的初始化逻辑,可以把这部分逻辑抽离到单独的配置类中,避免主启动类直接依赖业务Bean:
// 新建配置类存放初始化逻辑 @Configuration @Slf4j public class AppConfig { private final ApplicationParameterManager appParamManager; public AppConfig(ApplicationParameterManager appParamManager) { this.appParamManager = appParamManager; } @PostConstruct public void init() { // 原FlexApplication中的init逻辑迁移到这里 } } // 修改后的主启动类 @EnableTransactionManagement @SpringBootApplication @Slf4j public class FlexApplication{ // 移除构造函数和@PostConstruct方法 public FlexApplication() { } .... }
这样@DataJpaTest初始化时,主启动类不再依赖ApplicationParameterManager,就不会出现找不到Bean的问题。
方法三:使用完整应用上下文测试(不推荐)
如果不在乎测试启动速度,可以用@SpringBootTest替代@DataJpaTest,它会加载完整的应用上下文,自然能找到所有Bean,但测试启动会慢很多,只适合需要完整上下文的场景:
@SpringBootTest @AutoConfigureTestDatabase(replace= AutoConfigureTestDatabase.Replace.NONE) public class ListUserRepositoryTest { // 原有测试代码保持不变 }
内容的提问来源于stack exchange,提问作者robert trudel

