54

我有一个正在测试 jms 消息发送的 Junit 测试。我正在使用 Spring jmsTemplate 来执行此操作。在这里,我想在下面的代码中检查 JMS 模板是否调用了发送消息,而不管传递的实际参数的值是什么。

我的发布者方法使用 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

5 回答 5

105

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

Mockito.verify(mockTemplate, Mockito.times(1)).send(
    Mockito.eq("appointment.queue"), 
    Mockito.any(MessageCreator.class));
于 2013-05-09T10:35:26.437 回答
3

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

Mockito.when(mockedBean.mockedMethod(Mockito.anyString(), 
                                     Mockito.anyInt(),
                                     Mockito.anyInt(),
                                     Mockito.anyInt(),
                                     Mockito.anyBoolean())).thenReturn(new String()); 
于 2019-04-29T20:36:12.297 回答
3

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

我从以下模拟 Play.api 配置的代码中抛出了这个异常

"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 方法中可以有隐式参数configs.get 方法有一个显式参数和一个隐式参数我传递了一个模拟对象,当抛出异常时我想知道发生了什么,因为我没有混合参数和模拟,结果证明我也必须将模拟传递给隐式参数,这解决了问题。

 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)
于 2019-12-05T09:17:34.153 回答
2

尽管有正确的数量,但我看到这个关于参数不匹配的错误......

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

于 2020-02-14T18:45:42.923 回答
1

对于未来的读者。这将为您节省大量时间。

我们不能同时使用参数匹配器和原始/原始值。

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

when(fooService.getResult(anyString(),any(MyClass.class))).thenReturn(1); // correct
于 2021-11-15T08:28:00.293 回答