我有一个直接提供fooBean的java配置类和通过组件扫描提供barBean。
@Configuration
@ComponentScan(basePackages = { "com.blah" })
public class Config {
@Bean
public FooBean fooBean {
return new FooBean();
}
}
我希望在测试用例中重用它,我需要用模拟替换bean:
@Configuration
@Import(Config.class)
public class TestConfig {
@Bean
public FooBean fooBean {
return new FooBeanMock();
}
@Bean
public BarBean barBean {
return new BarBeanMock();
}
}
(这里重用Config没有多大意义,但在现实生活中我有1000豆,我只需要模拟一些)
这里fooBean被覆盖,但不是barBean。
Skipping loading bean definition for %s: a definition for bean " + "'%s' already exists. This is likely due to an override in XML.
还有一个官方问题: https://jira.springsource.org/browse/SPR-9682
有人知道覆盖组件扫描发现的bean的任何解决方法吗?
考虑到bean是遗留代码,无法修改,并且没有依赖项的设置者(私有属性+ @Resource)。
答案 0 :(得分:5)
尝试跳过不必要的bean:
@ComponentScan(basePackages = { "com.blah" }, excludeFilters = @Filter({UnnecessaryBean1.class, UnnecessaryBean2.class}))
答案 1 :(得分:0)
是的,您可以覆盖组件扫描发现的bean。我在测试用例中这样做。我使用XML配置,但我认为与Java配置非常相似。
spring.xml:
<context:component-scan base-package="cz.backend"/>
MyBeanImpl.java
@Component("myBean")
public class MyBeanImpl implements MyBean {
//Something
}
在测试文件夹中我有:
弹簧的test.xml:
<import resource="classpath:/spring.xml"/>
<bean id="myBean" class="cz.backend.MyBeanTestMock"/>
MyBeanTestMock.java:
public class MyBeanTestMock implements MyBean {
//Something
}
覆盖bean的名称必须相同。