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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章