2017-02-24 1 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

JmsTemplate에서 true으로 sessionTransacted을 설정해야합니다.

그러나 테스트 메시지는 커밋하지 않는 한 어느 곳에서도 수신 할 수 없다는 점에 유의하십시오.

관련 문제