mocking - 如何在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
解决方案
我建议考虑使用带有嵌入式模式的 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"/>
推荐阅读
- java - 如果不使用 else 语句,我们如何使用三元运算符?
- sql - presto/athena 有没有办法根据条件获取列名并在 group by 中使用它?
- javascript - 将 SVG 作为图像复制到剪贴板
- java - 不使用冒泡排序对数组进行排序
- c++ - 有没有办法控制 std::fstream 中的光标点?
- android - 从网站下载 Android 应用程序下载 - 防止 apk 被访问
- windows - 使用 Windows 任务计划程序将文件夹中的文件同步到另一个文件夹
- javascript - 未捕获的类型错误:无法读取空错误控制台的属性“删除”
- jquery - 如何在 jquery 数据表的 div 中永久添加内容?
- sql - 当没有找到值而不是空的“值”时,SQL 返回空的 JSON 括号