2016-03-25 7 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

は1つだけのパラメータ(MessageCreatorを)受け入れるsendメソッドをあざけるされていますが、実際には2つ(String, MessageCreatorを)受け入れるものを呼んでいます。

は、あなたのモックにStringを追加します。sesssionをからかったときに別の間違いが

 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)); 

があります。あなたはparameterersせずにメソッドをからかっている:

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

いますが、実際にはシリアライズのparamで1を模擬する必要があります。応答のための

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

感謝を。私はあなたが提案したように追加しようとした。実際のsendメソッドでは失敗します。私はそれが失敗した場所の上の場所を更新し、強調表示しました。実行中に* ObjectMessage message = session.createObjectMessage((Serializable)map)でMessageオブジェクトを取得しているため、何が失われているのか教えてください。 – Chintan

+0

@Chintan私は答えを – Ruben

+0

更新しました。私の間違いを指摘してくれてありがとう。私は今、その方法をテストすることができます。もう一度ありがとう! – Chintan