`

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  
     

相关推荐

Global site tag (gtag.js) - Google Analytics