【发布时间】:2018-12-13 08:44:57
【问题描述】:
我有一个 Spring 测试配置类,它应该覆盖 xml-config 中现有的 bean。但我的问题是 xml bean 覆盖了在我的测试配置中使用 primary 注释的 bean。我尝试用不同的名称命名测试bean,但这对我也不起作用。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {CamelJmsTest.TestConfig.class})
public class CamelJmsTest {
@Configuration
@ImportResource("classpath:production-beans-camel-jms.xml")
public static class TestConfig {
@Primary
@Bean
public JmsTemplate jmsTemplate() {
return new JmsTemplate(new ActiveMQConnectionFactory("", "", ACTIVE_MQ_HOST));
}
@Primary
@Bean // ideally i just want this bean to override the bean imported from the xml config
public RouteConfigBuilder routeConfig() {
return RouteConfigBuilder.builder().autoStart(true).build();
}
@Primary
@Bean
public RouteBuilder routeBuilder(@Value("${amq.endpoint}") String endpoint,
@Autowired Processor processor) {
return new RouteBuilder(routeConfig(), "", endpoint, processor);
}
}
private static final String ACTIVE_MQ_HOST = "vm://activeMQ";
@BeforeClass
public static void setActiveMQ() {
System.setProperty("amq.endpoint", ACTIVE_MQ_HOST);
}
@Autowired
JmsTemplate jmsTemplate;
@Test
public void postJmsMessage() {
jmsTemplate.send("queue/test", new MessageCreator() {
@Override
public Message createMessage(Session session) throws
JMSException {
return session.createTextMessage("Hello World");
}
});
try {
for (int i = 0; i < 100; i++) {
Thread.sleep(100);
}
} catch (Exception ignored) {
}
}
}
这里是相关的xml配置:
<bean id="routeConfig" class="routing.RouteConfigBuilder" init-method="builder">
<constructor-arg name="redeliveryDelay" value="${<props>.redeliveryDelay}" />
<constructor-arg name="maximumRedeliveries" value="${<props>.maximumRedeliveries}" />
<constructor-arg name="autoStart" value="false" />
</bean>
<bean id="routeBuilder" class="routing.RouteBuilder">
<constructor-arg ref="routeConfig" />
<constructor-arg name="routeId" value="ROUTE_ID_1"/>
<constructor-arg name="endpoint" value="${amq.endpoint}" />
<constructor-arg name="processor" ref="myProcessor" />
</bean>
这是日志输出。运行测试时:
Overriding bean definition for bean 'routeConfig' with a different
definition:
replacing [Root bean: class [null]; scope=; abstract=false;
lazyInit=false; autowireMode=3; dependencyCheck=0;
autowireCandidate=true; primary=true;
factoryBeanName=CamelJmsTest.TestConfig;
factoryMethodName=routeConfig; initMethodName=null;
destroyMethodName=(inferred);
defined in CamelJmsTest]
with [Generic bean: class [RouteConfigBuilder]; scope=;
abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0;
autowireCandidate=true; primary=false; factoryBeanName=null;
factoryMethodName=null; initMethodName=builder;
destroyMethodName=null;
defined in class path resource [production-beans-camel-jms.xml.xml]]
如您所见,我的测试配置中的主 bean 已被覆盖,我想在测试中使用我的测试配置 bean。
我正在使用 Spring 4.3.x。
我已经阅读了很多相关的帖子,但都没有给我答案。任何帮助,将不胜感激。
【问题讨论】:
标签: java spring dependency-injection integration-testing