2013-05-10 2 views
0

У меня есть код, отправляющий сообщения jms через Spring JMSTemplate. Для тестирования метода я использую Mockito.JMS Testing - JMSTemplate отправить не выполнено

Мой код выглядит следующим образом .... publishDialogueServiceMessage() ->

brokerUrl = jmsQueueProperties.getProperty(MessageRouterConstants.JMS_QUEUE_URL); 
     LOG.info("The broker url is : {}", brokerUrl); 
     jmsTemplate.send(jmsQueueProperties.getProperty(MessageRouterConstants.QUEUE), new MessageCreator() { 

      @Override 
      public Message createMessage(Session session) throws JMSException {    
       ObjectMessage obj = session.createObjectMessage(serviceResponse); 
       messageSent = true; 
       return obj; 
      } 
     }); 

В коде выше, чтобы я установить логическую переменную так, чтобы проверить, что если сообщение отправлено

Мой тест выглядит следующий,

@Before 
    public void setUp() throws Exception { 

     connectionFactory = Mockito.spy(new ActiveMQConnectionFactory(
       "vm://localhost?broker.persistent=false")); 
     conn = connectionFactory.createConnection(); 
     conn.start();  
    } 

@After 
public void cleanUp() throws Exception{ 
    conn.stop(); 
} 


@Test 
    public void testPublishDialogueServiceMessage() 
    { 
     ServiceResponse response = Mockito.mock(
       ServiceResponse.class, Mockito.withSettings() 
         .serializable()); 
     JmsTemplate mockTemplate = Mockito.mock(JmsTemplate.class); 
     java.util.Properties p = Mockito.mock(java.util.Properties.class);  
     Mockito.when(p.getProperty(MessageRouterConstants.QUEUE)) 
       .thenReturn("outbound.request.queue"); 
     mockTemplate.setConnectionFactory(connectionFactory); 
     mockTemplate.setDeliveryPersistent(true); 
     mockTemplate.setSessionAcknowledgeMode(2); 
     mockTemplate.setSessionTransacted(true); 

     ReflectionTestUtils.setField(publisher, "jmsQueueProperties", p); 
     ReflectionTestUtils.setField(publisher, "jmsTemplate", mockTemplate); 

     // test 
     publisher.publishDialogueServiceMessage(response); 
     ArgumentCaptor<MessageCreator> msgCreator = ArgumentCaptor.forClass(MessageCreator.class); 
     Mockito.verify(p, Mockito.times(2)) 
       .getProperty(Mockito.anyString()); 
     Mockito.verify(mockTemplate, Mockito.times(1)).send(
       Mockito.anyString(), Mockito.any(MessageCreator.class)); 

     //MessageCreator msgCrt = Mockito.spy(msgCreator.getValue()); 
     //Assert.notNull(msgCrt); 

     Assert.isTrue(publisher.isMessageSent()); 
    } 

В тесте i перед интересной проблемой publisher.isMessageSent() всегда возвращает мне FALSE, указывающую, что сообщение отправки не выполняется (?). но Mockito.verify (mockTemplate, Mockito.times (1)). отправить (Mockito.anyString(), Mockito.any (MessageCreator.class)); идет хорошо.

Мне интересно, в чем причина того, что моя переменная messageSent не установлена. Может кто-нибудь пролить свет, что я могу делать неправильно.

ответ

7

Простой, у вас есть макет для jmsTemplate (ваш mockTemplate). Когда метод вызывается на макет, он не делает ничего, кроме записи вызова макета. Таким образом, макет не знает, что он должен попытаться вызвать msgCreator.

Глядя на ваш тест, я вижу некоторые очевидные проблемы, которые указывают на недостаток знаний о Mockito. Почему вы устанавливаете все эти поля на mockTemplate? Это макет, он все равно не будет использовать эти поля. Это также говорит о том, что вам не нужен код в ваших @Before и @After.

Если вы действительно хотите, чтобы ваш тест отправлял сообщение через JMS (и тем самым вызывал создание сообщения), вы должны использовать spy на JmsTemplate вместо макета. Тем не менее, я бы очень обескураживал это, так как ваш тест будет зависеть от внешней системы, и вы фактически испытаете JsmTemplate. Достаточно того, что ваш макет вызывается надлежащим образом. Единственная дополнительная вещь, которую, я думаю, вам нужно сделать, - это вызвать создателя сообщения, передаваемого макету, чтобы убедиться, что он правильно создает сообщение.

+0

@JonhB Спасибо, Джон. Это помогает мне. – kuhajeyan

Смежные вопросы