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

kuh*_*yan 33 junit unit-testing 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;
}
});
Run Code Online (Sandbox Code Playgroud)

在我的测试..

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

但是当我执行时,我得到了

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:参数匹配器的使用无效!....

原因是由于Mockito.any(MessageCreator.class),但是没有办法测试我的send方法是在没有在MessageCreator中创建实际对象的情况下执行的.

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

JB *_*zet 71

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

Mockito.verify(mockTemplate, Mockito.times(1)).send(
    Mockito.eq("appointment.queue"), 
    Mockito.any(MessageCreator.class));
Run Code Online (Sandbox Code Playgroud)

  • 您可能必须使用真实的JmsTemplate实例和模拟的Session来执行此操作.或者您可以将消息创建外部化为另一个方法,并对此方法进行单元测试. (2认同)

Ada*_*h D 7

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

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

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

when(fooService.getResult(anyString(),any(MyClass.class))).thenReturn(1); // correct
Run Code Online (Sandbox Code Playgroud)