You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3测试报错:无法找到ApplicationParameterManager Bean

Spring Boot 3 切片测试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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:20:38