不知何时养成了习惯,在没有一个可运行的测试的时候,个人完全没有动力去写实际的业务代码。老觉得,没有测试来证明自己的确做了某件事,即使自己真的完成了某个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框架是Java开发中的核心组件,它以其IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)两大特性,极大地简化了企业级应用的开发工作。这个"spring的jar包"包含了...
7. **与其他技术的集成**:Spring框架与众多开源技术如Hibernate、MyBatis、Quartz、JMS等有良好的集成,4.3.13.RELEASE版本进一步提升了这些集成的稳定性,使得开发者能够无缝地将这些技术融入到Spring应用中。...
5. **Spring测试**:介绍如何编写单元测试和集成测试,使用Mockito和Spring Test进行测试驱动开发(TDD),确保代码的质量和稳定性。 6. **Spring安全**:讨论Spring Security,如何实现用户认证和授权,保护Web...
详细讲解Spring的Inversion of Control(控制反转)容器,包括Bean的生命周期、初始化、销毁过程以及Bean的装配方式,让读者深刻理解Spring容器的工作原理。 7. **Chapter 13:Spring Security** 本章介绍Spring ...
1. IoC(Inversion of Control):Spring 的核心理念之一,它通过容器管理对象的依赖关系,使得代码更加灵活和可测试。 2. AOP(Aspect Oriented Programming):Spring 提供了面向切面编程的支持,允许开发者定义横...
Spring为各种企业服务API提供了统一的抽象,如JDBC、JMS、JMX等,使得开发者无需直接与这些底层API交互,而是通过Spring的简单API来使用。这提高了代码的可读性和可维护性。 **事务管理**: Spring提供了声明式事务...
7. **测试支持**:Spring.NET框架包含单元测试和集成测试的支持,如Spring.Testing组件,它提供了一种方便的方式来配置和管理测试环境,简化了测试驱动开发(TDD)和行为驱动开发(BDD)。 8. **企业服务**:Spring...
Spring框架的核心在于IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)。IoC通过容器管理对象的生命周期和依赖关系,降低了代码间的耦合度;AOP则提供了声明式事务管理、...
- **测试驱动开发**:内置的测试框架支持TDD,确保代码质量。 5. **最佳实践** - **配置管理**:使用XML或Java配置,根据项目需求选择合适的方式。 - **组件化设计**:利用Spring的DI特性,将应用拆分为可复用的...
在阅读《Spring 中文开发手册》时,开发者将会学习到如何使用Spring进行单元测试,了解测试驱动开发(TDD)的最佳实践,以及如何利用Spring Boot进行快速开发。此外,手册还将涵盖Spring的最新版本和特性,确保...
Spring 2.0加强了与其他开源框架的集成,例如Struts、JSF等,以及与各种企业级服务如JMS、JMX的集成,使得开发者可以构建更加复杂和健壮的应用系统。 **9. 测试支持** Spring提供了丰富的测试工具,包括单元测试、...
10. **消息支持**:Spring Integration允许应用程序与其他系统通过消息传递进行通信,支持JMS、AMQP等多种协议。 在升级到Spring 3.2.19时,开发者应关注官方文档中的迁移指南,确保兼容性和性能的平滑过渡。同时,...
9. **测试与调试**:测试驱动开发(TDD)和持续集成(CI)是现代软件开发的重要组成部分,期刊可能讨论JUnit、Mockito等测试工具的使用,以及如何有效调试Java应用。 10. **分布式系统**:Java在构建分布式系统中的...
5. TDD(Test-Driven Development):先写测试,再编写代码,确保代码质量。 五、开源框架 现代J2EE开发中,许多开源框架简化了开发流程,如Spring Framework、Struts、Hibernate、MyBatis、Apache Maven等。这些...
进阶章节可能涉及Java EE的高级特性,如EJB(企业级JavaBean)、JMS(Java消息服务)、JPA(Java持久化API)和JTA(Java事务API),以及如何在MyEclipse中进行相关配置和测试。 10. **Spring框架** Spring是Java ...
12. **Spring框架**:作为最流行的Java应用框架,Spring的依赖注入、AOP(面向切面编程)、Spring Boot、Spring MVC等都是Java开发者需要了解和掌握的。 13. **数据库交互**:JDBC(Java Database Connectivity)是...
另外,书中还可能探讨了Java EE的其他关键组件,如EJB(Enterprise JavaBeans)用于构建企业级应用,JMS(Java Message Service)用于异步通信,以及JPA(Java Persistence API)和Hibernate等ORM(对象关系映射)...
9. **安全**:考虑到用户登录和交易的安全性,项目可能包含了如Spring Security这样的框架,用于身份验证、授权和保护敏感数据。 10. **部署与容器**:项目最终会部署在一个Java EE应用服务器上,如Tomcat、...
12. **Spring框架**:广泛应用于Java企业级开发,包括依赖注入(DI)、AOP(面向切面编程)、Spring Boot、Spring Cloud等。 13. **测试**:使用JUnit进行单元测试,Mockito进行模拟对象测试,理解测试驱动开发...
在实际编程实践中,作者还分享了如何使用Maven或Gradle进行项目构建,以及Spring框架的应用,包括依赖注入、AOP(面向切面编程)和Spring Boot的快速开发特性,这些是Java后端开发的关键技术。对于数据库操作,他...