Mockito - 参数匹配器的使用无效

时间:2013-05-09 09:05:31

标签: unit-testing junit mockito

我有测试jms消息发送的Junit测试。我使用Spring jmsTemplate来做到这一点。在这里,我在下面的代码中,我想检查JMS模板是否已调用发送消息,无论它传递的actuall参数的值是什么。

我的发布者方法使用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),但是没有办法测试我的send方法是否正在执行而没有在MessageCreator中创建实际对象。

更新 有没有办法检查我的 session.createObjectMessage(dialogueServiceResponse)也被调用

4 个答案:

答案 0 :(得分:64)

我认为消息的其余部分会告诉您问题所在。当您为其中一个参数使用参数匹配器时,所有其他参数也必须使用参数匹配器:

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

答案 1 :(得分:2)

尽管有正确的数字,我仍然看到有关参数#不匹配的错误……

我意识到这是因为被存根的方法是静态的。当我将其转换为非静态时,它按预期工作。

答案 2 :(得分:0)

我认为您不能在存根之外使用参数匹配器。我也遇到了同样的错误,但是当我返回时,我不得不执行新的string()而不是Mockito.anyString(),错误消失了。 示例:

Mockito.when(mockedBean.mockedMethod(Mockito.anyString(), 
                                     Mockito.anyInt(),
                                     Mockito.anyInt(),
                                     Mockito.anyInt(),
                                     Mockito.anyBoolean())).thenReturn(new String()); 

答案 3 :(得分:0)

我可以看到这个问题是关于Java代码的,但是我将分享这个问题,因为我们也在Scala中使用了Mockito。

以下模拟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)

    }
  }

在Scala中,方法可以具有Implicit parameters configs.get方法具有一个显式参数和一个隐式参数,我传递了一个模拟对象,当引发异常时,我想知道发生了什么,因为我没有MIX参数和模拟, 事实证明,我也必须将模拟传递给隐式参数,这解决了问题。

 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)