2016-03-25 2 views
1

Мой метод обслуживания выглядит ниже, я пытаюсь высмеять JmsTemplate, чтобы он мог отправлять сообщение во время модульного тестирования, но он не выполняет jmsTemplate.send (...), он напрямую переходит к следующей строке. Как я могу выполнить jmsTemplate.send (..) часть кода моего класса сервиса с помощью модульного тестирования?Spring jmsTemplate send Unit testing doen't work

public int invokeCallbackListener(final MyObject payload, final MyTask task) throws Exception{ 
     //create map of payload and taskId 
     int taskStatusCd = task.getTaskSatus().getCode(); 
     final Map<String, Object> map = new HashMap<String, Object>(); 
     map.put(PAYLOAD_KEY, payload); 
     map.put(TASK_ID_KEY, task.getTaskId()); 

     //generate JMSCorrelationID 
     final String correlationId = UUID.randomUUID().toString(); 

     String requestQueue = System.getProperty("REQUEST_QUEUE"); 
     requestQueue = requestQueue!=null?requestQueue:ExportConstants.DEFAULT_REQUEST_QUEUE; 
     jmsTemplate.send(requestQueue, new MessageCreator() {   
      @Override 
      public Message createMessage(Session session) throws JMSException { 
       ***ObjectMessage message = session.createObjectMessage((Serializable)map)***; //fail here. Message returns null 
       message.setJMSCorrelationID(correlationId); 
       message.setStringProperty(MESSAGE_TYPE_PROPERTY,payload.getMessageType().getMessageType());    
       return message; 
      }   
     }); 
     l.info("Request Message sent with correlationID: " + correlationId); 

     taskStatusCd = waitForResponseStatus(task.TaskId(), taskStatusCd, correlationId); 
     return taskStatusCd; 
    } 

Это мой код тестового класса.

RemoteInvocationService remoteInvocationService; 
    JmsTemplate mockTemplate; 
    Session mockSession; 
    Queue mockQueue; 
    ObjectMessage mockMessage; 
    MessageCreator mockmessageCreator; 
    @Before 
    public void setUp() throws Exception { 
     remoteInvocationService = new RemoteInvocationService(); 
     mockTemplate = mock(JmsTemplate.class); 
     mockSession = mock(Session.class); 
     mockQueue = mock(Queue.class); 
     mockMessage = mock(ObjectMessage.class); 
     mockmessageCreator = mock(MessageCreator.class); 
     when(mockSession.createObjectMessage()).thenReturn(mockMessage); 
     when(mockQueue.toString()).thenReturn("testQueue"); 

     Mockito.doAnswer(new Answer<Message>() { 
      @Override 
      public Message answer(final InvocationOnMock invocation) throws JMSException { 
       final Object[] args = invocation.getArguments(); 
        final String arg2 = (String)args[0]; 
      final MessageCreator arg = (MessageCreator)args[1]; 
       return arg.createMessage(mockSession); 
      } 
     }).when(mockTemplate).send(Mockito.any(MessageCreator.class)); 



      mockTemplate.setDefaultDestination(mockQueue); 
      remoteInvocationService.setJmsTemplate(mockTemplate); 
    } 


    @Test 
    public void testMessage() throws Exception{ 
     MyTask task = new MyTask(); 
     task.setTaskSatus(Status.Pending); 

     remoteInvocationService.invokeCallbackListener(new MyObject(), task); 


    } 

У меня есть код, который получает сообщение, но я получаю статус объекта null.

Message receivedMsg = jmsTemplate.receiveSelected(responseQueue, messageSelector);if(receivedMsg instanceof TextMessage){ 
       TextMessage status = (TextMessage) receivedMsg;    
       l.info(status.getText());} 

ниже тестового кода:

TextMessage mockTextMessage; 
    when(mockSession.createTextMessage()).thenReturn(mockTextMessage); 
    mockTextMessage.setText("5"); 

when(mockTemplate.receiveSelected(Mockito.any(String.class), Mockito.any(String.class))).thenReturn(mockTextMessage) 

ответ

0

Вы насмешливый send метод, который принимает только один параметр (MessageCreator), но вы на самом деле называть тот, который принимает два (String, MessageCreator).

Добавьте String в свой макет:

 Mockito.doAnswer(new Answer<Message>() { 
     @Override 
     public Message answer(final InvocationOnMock invocation) throws JMSException { 
      final Object[] args = invocation.getArguments(); 
      final MessageCreator arg = (MessageCreator)args[0]; 
      return arg.createMessage(mockSession); 
     } 
    }).when(mockTemplate).send(Mockito.any(String.class), Mockito.any(MessageCreator.class)); 

Существует еще одна ошибка, когда насмешливый sesssion. Вы насмехаясь метод без parameterers:

when(mockSession.createObjectMessage()).thenReturn(mockMessage); 

но вы на самом деле нужны издеваться один с сериализуемыми парами:

when(mockSession.createObjectMessage(Mockito.any(Serializable.class)).thenReturn(mockMessage); 
+0

Спасибо за ответ. Я попробовал добавить, как вы предложили. он не работает в режиме фактической отправки. i обновлено и выделено место выше, где он не работает. можете ли вы предложить мне, что мне не хватает, потому что я получаю объект Message null в * ObjectMessage message = session.createObjectMessage ((Serializable) map) во время выполнения. – Chintan

+0

@Chintan Я обновил ответ – Ruben

+0

Спасибо, что указал на мою ошибку. Я могу проверить этот метод сейчас. Еще раз спасибо! – Chintan