Spring не использует JMS-бины между тестовыми классами - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу создать и запустить сервер очереди сообщений (Artemis) и JMSListener только один раз для всего моего набора интеграционных тестов.

У меня есть класс конфигурации Java EventBeans Spring:

@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, но не при запуске TestClass2. В начале тестов TestClass2 вводятся оба вышеуказанных метода, воссоздающие ActiveMQServer и DefaultJmsListenerContainerFactory. Мое понимание из Повторное использование контекста приложения Spring в тестовых классах junit заключается в том, что @ContextConfiguration(EventBeans.class) должен был сделать это так, чтобы все эти тестовые классы с этой аннотацией повторно использовали сопряжение и компоненты bean. Почему он не использует те, которые созданы в TestClass1?

Я попытался включить журналы весеннего уровня отладки и установить точку останова в public DefaultJmsListenerContainerFactory jmsListenerContainerFactory, пока TestClass2 работает, и я вижу это, хотя я не уверен, что это значит:

[33m2019-04-24 11: 06: 12,774 [м [[37mmain [м] [36mDEBUG [м] [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m: возвращение кэшированный экземпляр синглтон-компонента 'eventBeans' [1m {} [m [33m2019-04-24 11: 06: 12,774 [m [[37mmain [m] [36mDEBUG [m] [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m: возвращение кэшированный экземпляр синглтон-компонента 'eventBeans' [1m {} [m [33m2019-04-24 11: 06: 12,774 [m [[37mmain [m] [36mDEBUG [m] [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m: возвращение кэшированный экземпляр синглтон-компонента «connectionFactory» [1m {} [m [33m2019-04-24 11: 06: 12,774 [m [[37mmain [m] [36mDEBUG [m] [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m: возвращение кэшированный экземпляр синглтон-компонента «connectionFactory» [1m {} [m [33m2019-04-24 11: 06: 12,775 [м [[37mmain [м] [36mDEBUG [м] [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m: возвращение кэшированный экземпляр одноэлементного компонента 'messageConverter' [1m {} [m [33m2019-04-24 11: 06: 12,775 [м [[37mmain [м] [36mDEBUG [м] [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m: возвращение кэшированный экземпляр одноэлементного компонента 'messageConverter' [1m {} [m [33m2019-04-24 11: 06: 12,775 [м [[37mmain [м] [36mDEBUG [м] [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m: Autowiring по типу из имени компонента 'jmsListenerContainerFactory' через фабрику метод к бину с именем 'connectionFactory' [1m {} [m [33m2019-04-24 11: 06: 12,775 [м [[37mmain [м] [36mDEBUG [м] [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m: Autowiring по типу из имени компонента 'jmsListenerContainerFactory' через фабрику метод к бину с именем 'connectionFactory' [1m {} [m [33m2019-04-24 11: 06: 12,775 [м [[37mmain [м] [36mDEBUG [м] [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m: Autowiring по типу из имени компонента 'jmsListenerContainerFactory' через фабрику метод к компоненту с именем 'messageConverter' [1m {} [m [33m2019-04-24 11: 06: 12,775 [м [[37mmain [м] [36mDEBUG [м] [36morg.spri.bean.fact.supp.DefaultListableBeanFactory [m: Autowiring по типу из имени компонента 'jmsListenerContainerFactory' через фабрику метод к компоненту с именем 'messageConverter' [1m {} [m

...