2013-05-09 28 views
19

我有測試jms消息發送的Junit測試。我正在使用Spring jmsTemplate來做到這一點。在這裏,我在下面的代碼中,我想檢查JMS模板是否調用了發送消息,而不管它傳遞的實參參數的值是什麼。Mockito - 參數匹配器的無效使用

我的出版商方法使用JmsTemplate發送方法看起來像裏面以下..

jmsTemplate.send(jmsQueueProperties.getProperty(key), new MessageCreator() 
{ 
    public Message createMessage(Session session) throws JMSException 
    { 
     ObjectMessage obj = session.createObjectMessage(dialogueServiceResponse); 
     return obj; 
} 
}); 

在我的測試..

JmsTemplate mockTemplate = Mockito.mock(JmsTemplate.class); 
... 
publisher.publishServiceMessage(response); 
.... 
Mockito.verify(mockTemplate, 
    Mockito.times(1)).send("appointment.queue", 
     Mockito.any(MessageCreator.class)); 

但是,當在執行我得到

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:使用參數匹配器無效! ....

原因是由於Mockito.any(MessageCreator.class),但不存在而不在讓MessageCreator實際的對象而被處決的方式來測試我的發送方法。

更新 ,是有辦法來檢查我session.createObjectMessage(dialogueServiceResponse)獲取調用以及

+0

模擬和驗證不能很好地協同工作。你需要的是爲你希望運行這些驗證的類創建一個間諜對象,而不是僅僅嘲笑它。 – 3xil3 2013-05-09 10:14:10

回答

45

我覺得消息的其餘部分告訴你是什麼問題。當您使用參數匹配器作爲其中一個參數時,所有其他參數也必須使用參數匹配器:

Mockito.verify(mockTemplate, Mockito.times(1)).send(
    Mockito.eq("appointment.queue"), 
    Mockito.any(MessageCreator.class)); 
+0

謝謝。是。這有助於對問題進行分類。但如果我想檢查session.createObjectMessage(dialogueServiceServiceResponse)被調用呢? – kuhajeyan 2013-05-09 11:27:32

+2

您可能必須使用帶有模擬會話的真實JmsTemplate實例來執行此操作。或者你可以將消息創建外部化爲另一種方法,並單元測試此方法。 – 2013-05-09 11:43:07

相關問題