2016-03-25 16 views
1

Servis yöntemim aşağıda göründüğü gibi, JmsTemplate ile alamıyorum, böylece birim testi sırasında mesaj gönderebilir, ancak jmsTemplate.send (...) doğrudan bir sonraki satıra gider, birim testini kullanarak servis sınıfımın jmsTemplate.send (..) kodunu nasıl uygulayabilirim?Spring jmsTemplate gönder Birim testi çalışmıyor

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

Bu benim test sınıf kodum.

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


    } 

Ben durumu nesnesi null adlı alıyorum, mesajı alır kodunun altına var ama. Test kodunun altında

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) 

cevap

0

Yalnızca bir parametre (MessageCreator) kabul send yöntemi alay ediyorsunuz, ama aslında iki (String, MessageCreator) kabul eden bir çağrıda bulunuyorlar. sesssion alay zaman

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

başka hata yok:

sizin taklidinin String ekleyin.

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

ama aslında Serializable param ile bir alay etmek gerekir:: Sen Parametrelerinin olmadan yöntemini alay ediyorsunuz yanıtı için

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

teşekkürler. Önerdiğin gibi eklemeyi denedim. gerçek gönderme yönteminde başarısız olur. Başarısız olduğu yerde güncellenmiş ve vurgulanmış konum. Ne zaman eksik olduğumu önerebilir misin? çünkü ObjectMessage message = session.createObjectMessage ((Serializable) haritası) Message object null. – Chintan

+0

@Chintan i – Ruben

+0

cevabını güncelledim Hatamı bildirdiğiniz için teşekkür ederiz. Şimdi bu yöntemi test edebiliyorum. Tekrar teşekkürler! – Chintan