春季JMS集成单元测试在队列上留言



我使用的是Spring 4.3.5.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>

这是在默认队列上创建消息的代码:

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

此测试效果很好,并且会在队列上正确输入消息!

我期望测试结束时,因为单位测试是交易的,该消息将退回队列,但似乎并非如此。

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

所以,我该如何真正交易,以便我刚刚在队列上输入的消息确实回滚,我是否必须手动告诉该测试才能回滚?

我已经使用数据库进行了数百个"集成"的单元测试,并且在一个测试中进行了每个插入,更新或删除之后,并且在测试结束时,数据库已将其汇回状态。测试,我希望我的消息队列或主题发生同样的事情。

对此的任何帮助都会很棒。谢谢!

您需要在JmsTemplate上将sessionTransacted设置为true

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

最新更新