64

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

2
  • mock and verify don't work well together. What you need is to create a spy object for the Class you wish to run these verifications on instead of just mocking it. Commented May 9, 2013 at 10:14
  • 3
    @3xil3 - that's false. It's perfectly possible to verify calls to a Mocked object. Commented Oct 1, 2018 at 20:16

7 Answers 7

115

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)); 
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks. Yes. that helped to sort the issue. but what about if I want to check session.createObjectMessage(dialogueServiceResponse) getting called?
You would probably have to use a real JmsTemplate instance with a mocked Session to do that. Or you could externalize the message creation to another method, and unit test this method.
10

For future readers. This will save you a lot of time.

We cannot use argument matcher and primitive/raw values together.

when(fooService.getResult("string",any(MyClass.class))).thenReturn(1); // will give error when(fooService.getResult(anyString(),any(MyClass.class))).thenReturn(1); // correct 

2 Comments

In my case, I have called the same metho two times changing the value which passes to that method to get two different results. in such scenario how to mock the same method for two times for different mock results
@SathyaMolagoda, use org.mockito.ArgumentMatchers.eq, as described here stackoverflow.com/a/50074126/8067983
4

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

1 Comment

Had a similar issue (it was complaining about expecting 2 matchers instead of 4). The real problem, however, was that I was returning the wrong type (MyClass instead of Mono<MyClass>).
3

I can see that this question is about Java code, but I will share this because we use Mockito in Scala as well.

I had this exception thrown from the following code that mocks Play.api configurations

"Configurations Service" should { "return all dataset configurations" in { val configs = mock[Configuration] val testData = Seq("SOME VALUE") val loader = any[ConfigLoader[Seq[String]]] when(configs.get[Seq[String]](any[String])).thenReturn(testData) // EXCEPTIONN HERE ! val configuration: ConfigurationsService = new ConfigurationsService(configs) assert(configuration.getSupportedDatasets() == testData) } } 

In Scala methods can have Implicit parameters configs.get method has one explicit param and an Implicit one I passed a mock object and when an exception was thrown I was wondering what is going on as I didn't MIX params and mocks, it turned out that I had to pass mocks to implicit parameters as well, and this solved the problem.

 val loader = any[ConfigLoader[Seq[String]]] // configs.get has one implicit parameter that accepts ConfigLoader[Seq[String]] when(configs.get[Seq[String]](any[String])(loader)).thenReturn(testData) 

1 Comment

Thanks! Passing mocks to implicit paramter helped me to solve the issue
2

I was seeing this error about a mismatched # of arguments, despite having the correct number...

I realized this was because method being stubbed was static. When I converted it to non-static, it worked as expected.

1 Comment

in case of Strings its wokring, what about boolean or int ?
1

For this error, I found I needed to swap out an "any()" for an "anyBoolean()" where the method takes a primitive boolean type. In general it might be the case that you have to use a more specific method than "any()" when the method has primitive type parameters.

Comments

0

Just wrap your String value with eq

Error

when(dictionaryService.getDictionaryValue(TYPES, IDENTIFIER, anyString())) .thenReturn("Double Awarding"); 
  • org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers!

Correct

when(dictionaryService.getDictionaryValue(eq(TYPES), eq(IDENTIFIER), anyString())) .thenReturn("Double Awarding"); 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.