Mockito - Invalid use of argument matchers

五迷三道 提交于 2019-12-28 05:56:15

问题


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


回答1:


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



回答2:


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



回答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)


来源:https://stackoverflow.com/questions/16458136/mockito-invalid-use-of-argument-matchers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!