`

TDD Of Spring JMS

 
阅读更多
不知何时养成了习惯,在没有一个可运行的测试的时候,个人完全没有动力去写实际的业务代码。老觉得,没有测试来证明自己的确做了某件事,即使自己真的完成了某个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
0
2
分享到:
评论
1 楼 kingrlf 2014-11-26  
     

相关推荐

    spring的jar包

    Spring框架是Java开发中的核心组件,它以其IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)两大特性,极大地简化了企业级应用的开发工作。这个"spring的jar包"包含了...

    spring-framework-4.3.13.RELEASE-dist

    7. **与其他技术的集成**:Spring框架与众多开源技术如Hibernate、MyBatis、Quartz、JMS等有良好的集成,4.3.13.RELEASE版本进一步提升了这些集成的稳定性,使得开发者能够无缝地将这些技术融入到Spring应用中。...

    Spring in action+中文版(第4版)spring 实践 高清目录版

    5. **Spring测试**:介绍如何编写单元测试和集成测试,使用Mockito和Spring Test进行测试驱动开发(TDD),确保代码的质量和稳定性。 6. **Spring安全**:讨论Spring Security,如何实现用户认证和授权,保护Web...

    精通spring2.x企业应用开发详解

    详细讲解Spring的Inversion of Control(控制反转)容器,包括Bean的生命周期、初始化、销毁过程以及Bean的装配方式,让读者深刻理解Spring容器的工作原理。 7. **Chapter 13:Spring Security** 本章介绍Spring ...

    spring-framework-4.3.6 API

    1. IoC(Inversion of Control):Spring 的核心理念之一,它通过容器管理对象的依赖关系,使得代码更加灵活和可测试。 2. AOP(Aspect Oriented Programming):Spring 提供了面向切面编程的支持,允许开发者定义横...

    spring培训学习笔记

    Spring为各种企业服务API提供了统一的抽象,如JDBC、JMS、JMX等,使得开发者无需直接与这些底层API交互,而是通过Spring的简单API来使用。这提高了代码的可读性和可维护性。 **事务管理**: Spring提供了声明式事务...

    Spring.NET框架参考文档_中文版

    7. **测试支持**:Spring.NET框架包含单元测试和集成测试的支持,如Spring.Testing组件,它提供了一种方便的方式来配置和管理测试环境,简化了测试驱动开发(TDD)和行为驱动开发(BDD)。 8. **企业服务**:Spring...

    spring-zh-CN.zip

    Spring框架的核心在于IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)。IoC通过容器管理对象的生命周期和依赖关系,降低了代码间的耦合度;AOP则提供了声明式事务管理、...

    spring-framework-4.3.3.RELEASE.jar

    - **测试驱动开发**:内置的测试框架支持TDD,确保代码质量。 5. **最佳实践** - **配置管理**:使用XML或Java配置,根据项目需求选择合适的方式。 - **组件化设计**:利用Spring的DI特性,将应用拆分为可复用的...

    Spring 中文开发手册

    在阅读《Spring 中文开发手册》时,开发者将会学习到如何使用Spring进行单元测试,了解测试驱动开发(TDD)的最佳实践,以及如何利用Spring Boot进行快速开发。此外,手册还将涵盖Spring的最新版本和特性,确保...

    spring

    Spring 2.0加强了与其他开源框架的集成,例如Struts、JSF等,以及与各种企业级服务如JMS、JMX的集成,使得开发者可以构建更加复杂和健壮的应用系统。 **9. 测试支持** Spring提供了丰富的测试工具,包括单元测试、...

    spring 3.2.19

    10. **消息支持**:Spring Integration允许应用程序与其他系统通过消息传递进行通信,支持JMS、AMQP等多种协议。 在升级到Spring 3.2.19时,开发者应关注官方文档中的迁移指南,确保兼容性和性能的平滑过渡。同时,...

    Java Magazine SeptemberOctober 2017

    9. **测试与调试**:测试驱动开发(TDD)和持续集成(CI)是现代软件开发的重要组成部分,期刊可能讨论JUnit、Mockito等测试工具的使用,以及如何有效调试Java应用。 10. **分布式系统**:Java在构建分布式系统中的...

    J2EE开发帮助文档

    5. TDD(Test-Driven Development):先写测试,再编写代码,确保代码质量。 五、开源框架 现代J2EE开发中,许多开源框架简化了开发流程,如Spring Framework、Struts、Hibernate、MyBatis、Apache Maven等。这些...

    MyEclipse 6 Java 开发中文教程(1-17章)全部代码

    进阶章节可能涉及Java EE的高级特性,如EJB(企业级JavaBean)、JMS(Java消息服务)、JPA(Java持久化API)和JTA(Java事务API),以及如何在MyEclipse中进行相关配置和测试。 10. **Spring框架** Spring是Java ...

    Java经典开发大全.zip

    12. **Spring框架**:作为最流行的Java应用框架,Spring的依赖注入、AOP(面向切面编程)、Spring Boot、Spring MVC等都是Java开发者需要了解和掌握的。 13. **数据库交互**:JDBC(Java Database Connectivity)是...

    java高手真经_系统架构卷:java.web系统设计与架构

    另外,书中还可能探讨了Java EE的其他关键组件,如EJB(Enterprise JavaBeans)用于构建企业级应用,JMS(Java Message Service)用于异步通信,以及JPA(Java Persistence API)和Hibernate等ORM(对象关系映射)...

    bookshop_Prj

    9. **安全**:考虑到用户登录和交易的安全性,项目可能包含了如Spring Security这样的框架,用于身份验证、授权和保护敏感数据。 10. **部署与容器**:项目最终会部署在一个Java EE应用服务器上,如Tomcat、...

    JAVA、开发大全

    12. **Spring框架**:广泛应用于Java企业级开发,包括依赖注入(DI)、AOP(面向切面编程)、Spring Boot、Spring Cloud等。 13. **测试**:使用JUnit进行单元测试,Mockito进行模拟对象测试,理解测试驱动开发...

    Java夜未眠.程序员的心声

    在实际编程实践中,作者还分享了如何使用Maven或Gradle进行项目构建,以及Spring框架的应用,包括依赖注入、AOP(面向切面编程)和Spring Boot的快速开发特性,这些是Java后端开发的关键技术。对于数据库操作,他...

Global site tag (gtag.js) - Google Analytics