2017-02-24 88 views
0

我使用Spring 4.3.5.Release和ActiveMQ 5.14.3來處理消息隊列。Spring JMS集成單元測試在隊列上留下消息

下面是從應用程序上下文文件我的定義:

<!-- Activemq connection factory --> 
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
    <!-- brokerURL, You may have different IP or port --> 
    <constructor-arg index="0" value="${message.broker.url}" /> 
</bean> 

<!-- Pooled Spring connection factory --> 
<bean id="jmsConnectionFactory" 
    class="org.springframework.jms.connection.CachingConnectionFactory"> 
    <constructor-arg ref="amqConnectionFactory" /> 
</bean> 

<!-- ======================================================= --> 
<!-- JMS Send, define default destination and JmsTemplate --> 
<!-- ======================================================= --> 
<!-- Default Destination Queue Definition --> 
<bean id="defaultDestination" class="org.apache.activemq.command.ActiveMQQueue"> 
    <!-- name of the queue --> 
    <constructor-arg index="0" value="${default.message.queue}" /> 
</bean> 

<bean id="jmsDestinationResolver" class="org.springframework.jms.support.destination.DynamicDestinationResolver"/> 

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" ref="jmsConnectionFactory"/> 
    <property name="defaultDestination" ref="defaultDestination" /> 
    <property name="destinationResolver" ref="jmsDestinationResolver"/> 
    <property name="pubSubDomain" value="${pub.sub.domain}"/> 
    <property name="receiveTimeout" value="${receive.timeout}"/> 
</bean> 

這裏是在默認隊列創建消息代碼:

public boolean sendResponse(final MyObjectDTO myObject) { 
    boolean success = false; 
    this.jmsTemplate.convertAndSend(ebvResponse); 
    success = true; 
    return success; 
} 

這裏是我的單元測試:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = 
{ "classpath:/spring/my-platform-services-context.xml" }) 
@Transactional 
public class MessageUtilTest extends TestCase { 

    @Autowired 
    private MessageUtil messageUtil; 

    @Test 
    public void testConvertSendMessageToDefault() throws JsonParseException, JsonMappingException, IOException { 
     MyObjectDTO myObject = new ManualCoverageDTO(); 
     myObject.setMessage(message); 
     boolean success = messageUtil.sendResponse(myObject); 
     assertEquals(true, success); 
    } 
} 

這個測試效果很好,並且一條消息正確地進入隊列!

我期望測試結束時,因爲單元測試是Transactional,消息會從隊列中回滾,但似乎不是。

我知道這是一個「集成」測試,因爲它實際上是觸摸ActiveMQ服務器並在隊列中放置消息。

那麼,我怎樣才能使這個真正的事務性,使我剛剛放在隊列中的消息真的回滾時,我必須手動告訴這個測試回滾?

我已經對數據庫進行了數百次「集成」單元測試,並且在每次插入,更新或刪除一次測試後,以及測試結束後,數據庫將回滾到它所處的狀態在測試之前,我希望我的消息隊列或主題發生同樣的事情。

任何幫助,這將是偉大的。謝謝!

回答

0

您需要將sessionTransacted設置爲JmsTemplatetrue

但是,請記住,除非您提交,否則您將無法在任何地方收到測試消息。