Testing Spring jmsTemplate发送单元测试doen';行不通

Testing Spring jmsTemplate发送单元测试doen';行不通,testing,mockito,send,jmstemplate,Testing,Mockito,Send,Jmstemplate,我的服务方法如下所示,我试图模拟JmsTemplate,以便它可以在单元测试期间发送消息,但它不执行JmsTemplate.send(…),它直接转到下一行,如何使用单元测试执行JmsTemplate.send(…)我的服务类的部分代码 public int invokeCallbackListener(final MyObject payload, final MyTask task) throws Exception{ //create map of payload and

我的服务方法如下所示,我试图模拟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;
    }
以下测试代码:

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

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

您正在模拟只接受一个参数(
MessageCreator
)的
send
方法,但实际上您正在调用接受两个参数的方法(
String,MessageCreator

字符串
添加到模拟:

     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(Mockito.any(Serializable.class)).thenReturn(mockMessage);

谢谢你的回复。我试着按照你的建议添加。它在实际的发送方法中失败。我更新并突出显示了上面失败的位置。你能告诉我我遗漏了什么,因为我在执行过程中在*ObjectMessage Message=session.createObjectMessage((可序列化)映射)处得到了消息对象null。谢谢你指出我的错误。我现在可以测试这个方法了。再次感谢!我还有消息接收方法。这不管用。我不熟悉Mockito框架。如果你能帮我完成以上代码,我将不胜感激?我更新了问题失败的地方。TextMessage status=(TextMessage)receivedMsg@Chintan可能和以前一样的问题。确保参数类型匹配。
     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);
when(mockSession.createObjectMessage(Mockito.any(Serializable.class)).thenReturn(mockMessage);