Как издеваться над заводской связью при весенней интеграции - PullRequest
0 голосов
/ 22 мая 2018

Я хотел бы посмеяться над фабрикой соединений JMS для проведения интеграционного тестирования.

<jee:jndi-lookup id="narconFactory" jndi-name="LBARQCF" resource-ref="false"/>

когда (?)

мы используем сервер websphere, а для тестирования интеграции необходимо использовать tomcat.Весенняя версия загрузки 1.5.3

РЕДАКТИРОВАТЬ : На основе комментариев я создал класс

@RunWith(SpringRunner.class)
@SpringBootTest
public class MQControllerTest {

//step 2
@Autowired
private MockMvc mvc;

@MockBean
private MQController mqController;

protected static final ConnectionFactory amqFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");

public static final CachingConnectionFactory connectionFactory = new CachingConnectionFactory(amqFactory);

@BeforeClass
public static void startUp() throws Exception {
    connectionFactory.setCacheConsumers(false);
    connectionFactory.createConnection().close();
}

@AfterClass
public static void shutDown() {
    connectionFactory.resetConnection();
}

@Autowired
private JmsTemplate mockJmsTemplate;

@Autowired
private SourcePollingChannelAdapter startJms;


@Before
public void setup() throws JMSException{
    Mockito.reset(this.mockJmsTemplate);
}   

@Test
public void test_tbm_vrijeDagenCorrectie() throws Exception {

    String expectedResponse ="";
    //using bddmockito
    given(mqController.tmVDCorrect(any(String.class))).willReturn(expectedResponse);

    this.startJms.start();

    mvc.perform(get("/tm/vdc/{dgn}","2016-01-16"))
               .andExpect(status().isOk());

}

}

В моих ресурсах - configфайл ** edit *** использовал полное имя пакета и сделал connectionFactory общедоступным

    <util:constant id="narconFactory" static-field="n.d.poc.MQControllerTest.connectionFactory"/>
     <util:constant id="vanconFactory" static-field="n.d.poc.MQControllerTest.connectionFactory"/> 

Ошибка:

Нет подходящего компонента типа 'org.springframework.test.web.servlet.MockMvc 'доступно: ожидается, по крайней мере, 1 бин, который квалифицируется как кандидат для автоматической передачи.Аннотации зависимостей: {@ org.springframework.beans.factory.annotation.Autowired (обязательно = true)} в org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound (DefaultListableBeanFactory).5.RELEASE.jar: 4.3.5.RELEASE]

Не уверен, в чем моя ошибка EDIT2:

Причина:org.springframework.beans.factory.BeanCreationException: ошибка создания бина с именем «narconFactory»: сбой вызова метода init;Вложенным исключением является javax.naming.NoInitialContextException: необходимо указать имя класса в свойстве среды или системы, либо в качестве параметра апплета, либо в файле ресурсов приложения: java.naming.factory.initial по адресу org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.555) ~ [spring-beans-4.3.8.RELEASE.jar: 4.3.8.RELEASE] в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:48-beans-[весна-483).8.RELEASE.jar: 4.3.8.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory.java:306) ~ [spring-beans-4.3.8.RELEASE.jar: 4.3.8.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:230) ~ [spring-beans-4.3.8.RELEASE.jar: 4.3.8.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory )j.~ [spring-beans-4.3.8.RELEASE.jar: 4.3.8.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:197) ~ [spring-beans-4.3.8.RELEASE.jar: 4.3.8.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:742) ~ [spring-beans-4.3.8.RELEASE.jar: 4.3.8.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:866) ~ [spring-context-4.3.8.RELEASE.jar: 4.3.8.RELEASE] в org.springfrapp.suAbstractApplicationContext.refresh (AbstractApplicationContext.java:542) ~ [spring-context-4.3.8.RELEASE.jar: 4.3.8.RELEASE] в org.springframework.boot.SpringApplication.refresh (SpringApplicaion.java:737) ~ [spring-boot-1.5.3.RELEASE.jar: 1.5.3.RELEASE] в org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:370) ~ [spring-boot-1.5.3.RELEASE.jar: 1.5.3.RELEASE] at org.springframework.boot.SpringApplication.run (SpringApplication.java:314) ~ [spring-boot-1.5.3.RELEASE.jar: 1.5.3.RELEASE]в org.springframework.boot.test.context.SpringBootContextLoader.loadContext (SpringBootContextLoader.java:120) ~ [spring-boot-test-1.5.3.RELEASE.jar: 1.5.3.RELEASE] в org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal (DefaultCacheAwareContextLoaderDelegate.java:98) ~ [spring-test-4.3.8.RELEASE.jar: 4.3.8.RELEASE] вorg.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext (DefaultCacheAwareContextLoaderDelegate.java:116) ~ [spring-test-4.3.8.RELEASE.jar: 4.3.8.RELEASE] ... 27 общих кадров опущено * 10

почему модульное тестирование ищет java.naming.factory.initial?можно указать в свойствах приложения и с каким значением?

EDIT3:

пример кода в github https://github.com/kswat/LRIntegrationUnit

1 Ответ

0 голосов
/ 22 мая 2018

Я бы посоветовал рассмотреть использование ActiveMQ со встроенным режимом вместо насмешек.Таким образом, вы получите полностью развернутый JMS и не будете иметь дело с низкоуровневыми ресурсами, которые также могут быть имитированы.

В Spring Integration у нас это есть для целей тестирования:

/**
 * Keeps an ActiveMQ {@link VMTransport} open for the duration of
 * all tests (avoids cycling the transport each time the last
 * connection is closed).
 * @author Gary Russell
 * @since 3.0
 *
 */
public abstract class ActiveMQMultiContextTests {

    protected static final ConnectionFactory amqFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");

    protected static final CachingConnectionFactory connectionFactory = new CachingConnectionFactory(
            amqFactory);

    @BeforeClass
    public static void startUp() throws Exception {
        connectionFactory.setCacheConsumers(false);
        connectionFactory.createConnection().close();
    }

    @AfterClass
    public static void shutDown() {
        connectionFactory.resetConnection();
    }

}

ЭтоconnectionFactory Статическое свойство действительно может использоваться в качестве компонента:

<util:constant id="narconFactory"
               static-field="ActiveMQMultiContextTests.connectionFactory"/>
...