Spring jmsTemplate отправляет модульное тестирование не работает

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

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)

person Chintan    schedule 25.03.2016    source источник


Ответы (1)


Вы издеваетесь над методом 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));

Есть еще одна ошибка при имитации сеанса. Вы издеваетесь над методом без параметризаторов:

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

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

when(mockSession.createObjectMessage(Mockito.any(Serializable.class)).thenReturn(mockMessage);
person Ruben    schedule 27.03.2016
comment
Спасибо за ответ. Я попытался добавить, как вы предложили. он терпит неудачу в фактическом методе отправки. я обновил и выделил место выше, где это не удается. Можете ли вы предложить мне, что мне не хватает, потому что я получаю объект Message null в *ObjectMessage message = session.createObjectMessage((Serializable)map) во время выполнения. - person Chintan; 28.03.2016
comment
Спасибо, что указали на мою ошибку. Теперь я могу проверить этот метод. Еще раз спасибо! - person Chintan; 29.03.2016
comment
У меня также есть метод получения сообщений. что не работает. Я новичок в фреймворке Mockito. признателен, если вы можете помочь мне с приведенным выше кодом? я обновил свой вопрос, где он терпит неудачу. Статус TextMessage = (TextMessage) ReceiveMsg; - person Chintan; 29.03.2016
comment
@Chintan Вероятно, та же проблема, что и раньше. Убедитесь, что типы параметров совпадают. - person Ruben; 30.03.2016