Spring不会在测试类之间重用jms bean

时间:2019-04-24 15:34:16

标签: java spring spring-boot jms activemq-artemis

对于整个集成测试套件,我只想创建和启动一次消息队列服务器(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时创建DefaultJmsListenerContainerFactoryTestClass1 bean,但在运行{{ 1}}。在TestClass2的测试开始时,同时输入了上述两种方法,并重新创建了TestClass2ActiveMQServer。我对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

0 个答案:

没有答案