2017-02-24 5 views
0

Ich benutze Spring 4.3.5.Release und ActiveMQ 5.14.3 Message Queuing zu behandeln.Spring JMS Integration Unit Test lässt Nachricht in der Warteschlange

Hier meine Definition aus dem Anwendungskontext Datei ist:

<!-- 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> 

Und hier ist der Code eine Nachricht auf der Standard-Warteschlange für die Erstellung von:

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

Hier ist mein Unit-Test:

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

Dieser Test funktioniert gut, und eine Nachricht wird richtig in die Warteschlange eingereiht!

Ich erwarte, wenn der Test vorbei ist, weil der Komponententest Transactional ist, würde die Nachricht aus der Warteschlange zurückrollen, aber es scheint nicht zu sein.

Ich weiß, dies ist ein "integrierter" Test, da es tatsächlich den ActiveMQ-Server berührt und eine Nachricht in die Warteschlange stellt.

Also, wie kann ich das wirklich transaktional machen, so dass die Nachricht, die ich gerade in die Warteschlange gelegt habe, wirklich zurückrollt, wenn es fertig ist, muss ich diesen Test manuell auf Rollback setzen?

Ich habe Hunderte von "integrierten" Komponententests mit der Datenbank durchgeführt, und nach jedem Einfügen, Aktualisieren oder Löschen innerhalb eines Tests und dem Ende des Tests wird die Datenbank in den Zustand zurückgesetzt, der sie war Vor dem Test möchte ich das Gleiche mit meinen Nachrichtenwarteschlangen oder Themen tun.

Jede Hilfe mit diesem wäre großartig. Vielen Dank!

Antwort

0

Sie müssen sessionTransacted auf dem JmsTemplate zu true setzen.

Aber bedenken Sie, dass Sie die Testnachricht an keinem Ort empfangen können, es sei denn, Sie verpflichten sich dazu.

Verwandte Themen