对于整个集成测试套件,我只想创建和启动一次消息队列服务器(Artemis)和JMSListener一次。
我有一个EventBeans Spring java配置类:
@Configuration
@Profile("!noserver")
public class EventBeans {
@Bean(destroyMethod = "stop")
public ActiveMQServer testBroker() throws Exception {
ActiveMQServer server = ActiveMQServers.newActiveMQServer(new ConfigurationImpl()
.setPersistenceEnabled(false)
.setJournalDirectory("muJournalLocation")
.setSecurityEnabled(false)
.addAcceptorConfiguration("netty", "tcp://localhost:61617"));
server.start();
return server;
}
@Primary
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory,
MappingJackson2MessageConverter messageConverter) {
DefaultJmsListenerContainerFactory containerFactory = new DefaultJmsListenerContainerFactory();
containerFactory.setConnectionFactory(connectionFactory);
containerFactory.setPubSubDomain(true);
containerFactory.setSubscriptionDurable(true);
containerFactory.setClientId("myClientId");
containerFactory.setMessageConverter(messageConverter);
return containerFactory;
}
}
我有两个测试类:
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = { EventBeans.class })
@EnableAutoConfiguration
public class TestClass1 {
...
}
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = { EventBeans.class })
@EnableAutoConfiguration
public class TestClass2 {
...
}
当我与junit一起运行这两个测试类中的所有测试时,我希望在运行ActiveMQServer
时创建DefaultJmsListenerContainerFactory
和TestClass1
bean,但在运行{{ 1}}。在TestClass2
的测试开始时,同时输入了上述两种方法,并重新创建了TestClass2
和ActiveMQServer
。我对Reuse spring application context across junit test classes的理解是DefaultJmsListenerContainerFactory
应该做到这一点,以便所有带有该批注的测试类都可以重用配置和其中的Bean。为什么不使用在@ContextConfiguration(EventBeans.class)
中创建的内容呢?
我尝试打开Spring调试级别的日志,并在TestClass1
运行时在public DefaultJmsListenerContainerFactory jmsListenerContainerFactory
中放置一个断点,尽管不知道是什么意思,但我看到了:
[33m2019-04-24 11:06:12,774 [m [[37mmain [m] [36mDEBUG [m [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m:返回 单例bean'eventBeans'[1m {} [m [33m2019-04-24 11:06:12,774 [m [[37mmain [m] [36mDEBUG [m [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m:返回 单例bean'eventBeans'[1m {} [m [33m2019-04-24 11:06:12,774 [m [[37mmain [m] [36mDEBUG [m [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m:返回 单例bean'connectionFactory'[1m {} [m [33m2019-04-24 11:06:12,774 [m [[37mmain [m] [36mDEBUG [m [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m:返回 单例bean'connectionFactory'[1m {} [m [33m2019-04-24 11:06:12,775 [m [[37mmain [m] [36mDEBUG [m [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m:返回 单例bean'messageConverter'[1m {} [m [33m2019-04-24 11:06:12,775 [m [[37mmain [m] [36mDEBUG [m [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m:返回 单例bean'messageConverter'[1m {} [m [33m2019-04-24 11:06:12,775 [m [[37mmain [m] [36mDEBUG [m [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m:自动装配 通过工厂从bean名称'jmsListenerContainerFactory'中的类型 名为“ connectionFactory”的bean的方法[1m {} [m [33m2019-04-24 11:06:12,775 [m [[37mmain [m] [36mDEBUG [m [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m:自动装配 通过工厂从bean名称'jmsListenerContainerFactory'中的类型 名为“ connectionFactory”的bean的方法[1m {} [m [33m2019-04-24 11:06:12,775 [m [[37mmain [m] [36mDEBUG [m [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m:自动装配 通过工厂从bean名称'jmsListenerContainerFactory'中的类型 名为“ messageConverter”的bean的方法[1m {} [m [33m2019-04-24 11:06:12,775 [m [[37mmain [m] [36mDEBUG [m [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m:自动装配 通过工厂从bean名称'jmsListenerContainerFactory'中的类型 名为“ messageConverter” [1m {} [m