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上拿到:[url]https://github.com/xianlinbox/TDD_Demo/tree/master/JMS[/url]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章