Spring配置测试Bean时报Abstract bean cannot be used here错误如何解决
错误原因
- Spring框架中被标记为
abstract="true"的Bean属于抽象Bean,本质是作为公共配置模板供子Bean继承使用,Spring不会对其进行实例化,因此无法直接作为依赖注入给其他业务Bean,这就是你看到Abstract bean cannot be used here错误的直接原因。 - 除此之外你的配置还存在隐藏问题:
SecurityManagerService的构造方法要求传入3个参数(UserRepository、RoleRepository、RightRepository),当前仅配置了1个构造参数,后续即便修复抽象Bean问题也会抛出参数不匹配的错误。
解决方法
根据你的测试场景选择对应配置方案即可:
方案1:使用真实Repository实现(适用于集成测试)
如果你的UserRepository、RoleRepository、RightRepository是Spring Data JPA接口,不需要手动写实现类,去掉abstract属性、补全所有构造参数即可,配置示例:
<bean id="userRepository" class="eu.lopo.repositories.security.UserRepository"/> <bean id="roleRepository" class="eu.lopo.repositories.security.RoleRepository"/> <bean id="rightRepository" class="eu.lopo.repositories.security.RightRepository"/> <bean id="securityManagerService" class="eu.lopo.services.security.SecurityManagerService"> <constructor-arg ref="userRepository"/> <constructor-arg ref="roleRepository"/> <constructor-arg ref="rightRepository"/> </bean>
方案2:使用Mock对象(适用于单元测试)
如果是单元测试不需要连接真实数据库,可以配置Mock对象作为依赖,示例如下(以Mockito为例):
<bean id="userRepository" class="org.mockito.Mockito" factory-method="mock"> <constructor-arg value="eu.lopo.repositories.security.UserRepository"/> </bean> <bean id="roleRepository" class="org.mockito.Mockito" factory-method="mock"> <constructor-arg value="eu.lopo.repositories.security.RoleRepository"/> </bean> <bean id="rightRepository" class="org.mockito.Mockito" factory-method="mock"> <constructor-arg value="eu.lopo.repositories.security.RightRepository"/> </bean> <bean id="securityManagerService" class="eu.lopo.services.security.SecurityManagerService"> <constructor-arg ref="userRepository"/> <constructor-arg ref="roleRepository"/> <constructor-arg ref="rightRepository"/> </bean>
内容的提问来源于stack exchange,提问作者Nunyet Calçada
相关产品推荐
相关产品推荐

