首页 > 解决方案 > 如何在spring集成中模拟连接工厂

问题描述

我想模拟 JMS 连接工厂来进行集成测试。

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

什么时候 (?)

我们使用websphere server,集成测试需要使用tomcat。Spring Boot 版本为 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());

}

}

在我的资源中-配置文件**编辑***使用完整的包名并将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”类型的合格 bean:预计至少有 1 个有资格作为自动装配候选者的 bean。依赖注释:{@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1474) ~[spring-beans-4.3 .5.RELEASE.jar:4.3.5.RELEASE]

不知道我的错误是什么 EDIT2:

原因:org.springframework.beans.factory.BeanCreationException:创建名为“narconFactory”的bean时出错:调用init方法失败;嵌套异常是 javax.naming.NoInitialContextException:需要在环境或系统属性中指定类名,或作为小程序参数,或在应用程序资源文件中:org.springframework.beans.factory.support 中的 java.naming.factory.initial .AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java: 555)〜[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory。

为什么单元测试要寻找 java.naming.factory.initial?我可以在应用程序属性中提供什么价值?

编辑3:

github 中的示例代码 https://github.com/kswat/LRIntegrationUnit

标签: mockingjmsspring-integrationspring-jms

解决方案


我建议考虑使用带有嵌入式模式的 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静态属性确实可以用作 bean:

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

推荐阅读