Я хочу создать и запустить сервер очереди сообщений (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