如何在 spring 集成中模拟连接工厂
How to mock connection factory in spring integration
我想模拟 JMS 连接工厂来进行集成测试。
<jee:jndi-lookup id="narconFactory" jndi-name="LBARQCF" resource-ref="false"/>
当 (?)
我们使用 websphere 服务器,集成测试需要使用 tomcat。 Spring 引导版本为 1.5.3
编辑:
根据评论,我创建了一个 class
@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());
}
}
在我的资源中 - 配置文件 ** edit*** 使用了完整的包名并将 connectionFactory 设置为 public
<util:constant id="narconFactory" static-field="n.d.poc.MQControllerTest.connectionFactory"/>
<util:constant id="vanconFactory" static-field="n.d.poc.MQControllerTest.connectionFactory"/>
错误:
No qualifying bean of type 'org.springframework.test.web.servlet.MockMvc' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@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]
不确定我的错误是什么
编辑 2:
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'narconFactory': Invocation of
init method failed; nested exception is
javax.naming.NoInitialContextException: Need to specify class name in
environment or system property, or as an applet parameter, or in an
application resource file: java.naming.factory.initial at
org.springframework.beans.factory.support.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] at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] at
org.springframework.beans.factory.support.AbstractBeanFactory.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] at
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] at
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] at
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE] at
org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737)
~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] at
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] at
org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120)
~[spring-boot-test-1.5.3.RELEASE.jar:1.5.3.RELEASE] at
org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
~[spring-test-4.3.8.RELEASE.jar:4.3.8.RELEASE] at
org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
~[spring-test-4.3.8.RELEASE.jar:4.3.8.RELEASE] ... 27 common frames
omitted
为什么单元测试正在寻找 java.naming.factory.initial?我可以在应用程序属性中提供什么值吗?
编辑3:
sample code in github
https://github.com/kswat/LRIntegrationUnit
我建议考虑使用 ActiveMQ 及其嵌入式模式而不是模拟。这样您将获得完全成熟的 JMS,并且不会处理低级资源以进行模拟。
在 Spring 集成中,我们有这个用于测试目的:
/**
* 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
static 属性确实可以当bean使用:
<util:constant id="narconFactory"
static-field="ActiveMQMultiContextTests.connectionFactory"/>
我想模拟 JMS 连接工厂来进行集成测试。
<jee:jndi-lookup id="narconFactory" jndi-name="LBARQCF" resource-ref="false"/>
当 (?)
我们使用 websphere 服务器,集成测试需要使用 tomcat。 Spring 引导版本为 1.5.3
编辑: 根据评论,我创建了一个 class
@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());
}
}
在我的资源中 - 配置文件 ** edit*** 使用了完整的包名并将 connectionFactory 设置为 public
<util:constant id="narconFactory" static-field="n.d.poc.MQControllerTest.connectionFactory"/>
<util:constant id="vanconFactory" static-field="n.d.poc.MQControllerTest.connectionFactory"/>
错误:
No qualifying bean of type 'org.springframework.test.web.servlet.MockMvc' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@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]
不确定我的错误是什么 编辑 2:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'narconFactory': Invocation of init method failed; nested exception is javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial at org.springframework.beans.factory.support.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] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.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] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] at 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] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) ~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] at 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] at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120) ~[spring-boot-test-1.5.3.RELEASE.jar:1.5.3.RELEASE] at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98) ~[spring-test-4.3.8.RELEASE.jar:4.3.8.RELEASE] at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) ~[spring-test-4.3.8.RELEASE.jar:4.3.8.RELEASE] ... 27 common frames omitted
为什么单元测试正在寻找 java.naming.factory.initial?我可以在应用程序属性中提供什么值吗?
编辑3:
sample code in github https://github.com/kswat/LRIntegrationUnit
我建议考虑使用 ActiveMQ 及其嵌入式模式而不是模拟。这样您将获得完全成熟的 JMS,并且不会处理低级资源以进行模拟。
在 Spring 集成中,我们有这个用于测试目的:
/**
* 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
static 属性确实可以当bean使用:
<util:constant id="narconFactory"
static-field="ActiveMQMultiContextTests.connectionFactory"/>