Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mockito - Invalid use of argument matchers

I have Junit test that is testing jms message sending. I am using Spring jmsTemplate to to do this. Here I as in the following code I want to check whether the JMS template has called send message regardless what is it in the values of actuall parameters that are passed.

my publisher method the uses the jmsTemplate to send method looks like following inside..

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

in My tests..

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

But when in the execution i get

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! ....

Cause is due to Mockito.any(MessageCreator.class) , but isn't there a way to test my send method is getting executed without creating an actual object in the MessageCreator.

Update And is there a way to check my session.createObjectMessage(dialogueServiceResponse) is getting called as well

like image 922
kuhajeyan Avatar asked May 09 '13 09:05

kuhajeyan


People also ask

What is EQ Mockito?

Mockito Argument Matcher - eq() When we use argument matchers, then all the arguments should use matchers. If we want to use a specific value for an argument, then we can use eq() method. when(mockFoo. bool(eq("false"), anyInt(), any(Object. class))).


2 Answers

I think the rest of the message tells you what the problem is. When you use an argument matcher for one of the arguments, all the other arguments must also use an argument matcher:

Mockito.verify(mockTemplate, Mockito.times(1)).send(     Mockito.eq("appointment.queue"),      Mockito.any(MessageCreator.class)); 
like image 193
JB Nizet Avatar answered Sep 24 '22 10:09

JB Nizet


I think you cannot use argument matchers outside stubbing. I also got the same error but when I return, I had to do new string() instead of Mockito.anyString() and the error goes away. Example:

Mockito.when(mockedBean.mockedMethod(Mockito.anyString(),                                       Mockito.anyInt(),                                      Mockito.anyInt(),                                      Mockito.anyInt(),                                      Mockito.anyBoolean())).thenReturn(new String());  
like image 37
BruceWayne Avatar answered Sep 22 '22 10:09

BruceWayne