不知何时养成了习惯,在没有一个可运行的测试的时候,个人完全没有动力去写实际的业务代码。老觉得,没有测试来证明自己的确做了某件事,即使自己真的完成了某个Task,也心里很没底。
比方说,我想写一个基于JMS的MessageSender, 首先就得想这个MessageSender的功能是什么? 我应该怎么测试这个功能?
功能: MessageSender的作用就是发送一个指定的Message到一个指定的Message Queue中。
测试步骤:
1.创建Message Queue
2.创建Message
3.发送Message到MessageQueue
4.验证Message发送到了MessageQueue中(可通过MessageQueueListener得到Message Queue中的Message)
代码实现过程,首先配置Message Sender, 确认Message会发往的服务器:
<!-- a pooling based JMS provider -->
<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616"/>
</bean>
</property>
</bean>
<!-- Spring JMS Template -->
<bean id="myJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsFactory"/>
</bean>
<bean id="jmsQueueSender" class="com.xianlinbox.JmsQueueSender">
<property name="jmsTemplate" ref="myJmsTemplate"/>
</bean>
然后,配置MessageQueueListener,确保message到达Queue之后,我们能够获取到:
<!-- A POJO that implements the JMS message listener -->
<bean id="messageListener" class="com.xianlinbox.MyQueueMessageListener"/>
<!-- The Spring message listener container configuration -->
<jms:listener-container
container-type="default"
connection-factory="jmsFactory"
acknowledge="auto">
<jms:listener destination="${queue.name}" ref="messageListener" method="onMessage"/>
</jms:listener-container>
然后,在测试代码中使用该配置做测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class JmsQueueSenderIntegrationTest {
@Autowired
private JmsQueueSender jmsQueueSender;
@Autowired
private MyQueueMessageListener messageListener;
@Before
public void setUp() throws Exception {
createActiveMQMessageQueue();
}
//启动临时MQ Server,确保Sender能连接到MQ server
private void createActiveMQMessageQueue() throws Exception {
BrokerService broker = new BrokerService();
broker.addConnector("tcp://localhost:61616");
//不持久化,仅使用内存保存message,防止上一次的结果影响下次测试
broker.setPersistent(false);
broker.start();
}
@Test
public void shouldSendMessageSuccessfully() throws Exception {
Queue testQueue = new ActiveMQQueue("TEST.QUEUE");
String message = "test queue content";
jmsQueueSender.send(message, testQueue);
//休眠5s,等待Listener处理message。
Thread.sleep(5000);
assertThat(messageListener.getMessages().size(), equalTo(1));
assertThat(messageListener.getMessages().get(0), equalTo("test queue content"));
}
}
注:在测试中,使用了Active MQ作为测试用MQ Server,想使用其他的MQ Server直接替换掉配置文件中的ConnectionFactory,然后启动响应的临时MQ server就行了。
本示例中所有代码可以在GitHub上拿到:
https://github.com/xianlinbox/TDD_Demo/tree/master/JMS
分享到:
相关推荐
spring-boot-tdd-example:tdd学习spring入门demo
弹簧Spring和Spring研究
tdd-spring-react 此应用程序是使用Spring和React构建的,所有内容均通过udemy教程“ 之后的TDD方法来实现。
Spring Hibernate Data Modeling REST and TDD Agile Java Design and Development 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
使用Spring&React测试驱动的Web应用程序开发 这个应用程序是用Spring和React构建的,所有东西都是用TDD方法实现的。 您可以在Udemy的《 找到完整的培训。
Heroku is a cloud application platform that offers a new way of building and deploying web apps. 模型类图 api类图 api序列图-付款 api序列图-获取付款 MongoDB嵌入式配置 数据库:信用卡 收款:付款 网址:...
单元测试 TDD EASYMOCK 的一般用法说明 实例
ørespoitório Projetos possui diversos projetos utilizandoJava8,TDD的Maven,bibliotecas MAIS usadas等 可以使用JDBC代替Java,也可以使用mysql进行交易。 可以将JPA2 e hibernate项目转换为普通数据表,也...
华为LTE TDD系统原理培训PPT文档
TDD测试驱动开发,准备的资料,我自己用的,公司只能上CSDN社区
Laravel开发-tdd 时分双工
GSM TDD noise 分析,但愿对GSM RF感兴趣的您有所帮助
C语言的TDD参考示例代码,主要包含了书中所参考的源代码
使用phpunit 一步一步使用tdd开发模式,减少bug数,提高项目质量
极限编程+TDD开发
使用Spring Boot从上到下TDD的示例资料来源:来源报价: 有没有想过如何在不进行外部API调用的情况下测试诸如缓存之类的难题或编写集成测试? 还是遇到一种情况,即很难对某项进行测试以至于无法对其进行测试? 如今...
GSM TDD 板振说明及分析方法、解决方法总结
TDD 测试
3GPP采用“求同存异”的原则进行L1E FDD和TDD的标准制定工作.将两种制式的协议实现在相同的规范中描述,并尽可能保证其协议实现相同,如遇到无法融合的差异,则仅针对差异部分进行分别描述。标准制定的这种指导思想...
Spring Boot REST API TDD 演示REST API的Spring Boot应用程序是测试优先开发的。 使用1个域模型 1个控制器,执行2个动作 使用本地 MySql数据库请参阅src/main/resources/{application,application-test}....