Unit testing SpringJMS集成单元测试在队列上留下消息

Unit testing SpringJMS集成单元测试在队列上留下消息,unit-testing,activemq,junit4,spring-jms,Unit Testing,Activemq,Junit4,Spring Jms,我使用Spring 4.3.5.Release和ActiveMQ 5.14.3来处理消息队列 以下是我在应用程序上下文文件中的定义: <!-- Activemq connection factory --> <bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <!-- brokerURL, You may have different I

我使用Spring 4.3.5.Release和ActiveMQ 5.14.3来处理消息队列

以下是我在应用程序上下文文件中的定义:

<!-- 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>
下面是我的单元测试:

@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);
    }
}
这个测试非常有效,消息正确地进入队列

我希望当测试结束时,因为单元测试是事务性的,所以消息会从队列中滚回,但看起来不是这样

我知道这是一个“集成”测试,因为它实际上正在接触ActiveMQ服务器并将消息放入队列

那么,我如何才能使它真正具有事务性,以便我刚才放在队列上的消息在完成后真正回滚,我是否必须手动告诉这个测试回滚

我已经对数据库进行了数百次“集成”单元测试,在一次测试中每次插入、更新或删除之后,测试结束时,数据库将回滚到测试前的状态,我希望消息队列或主题也会发生同样的情况


这方面的任何帮助都会很好。谢谢

您需要将
JmsTemplate
上的
sessiontransact
设置为
true

但是,请记住,除非您提交测试消息,否则您将无法在任何地方接收测试消息

@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);
    }
}