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

bweufnob  于 2023-03-12  发布在  其他
关注(0)|答案(6)|浏览(175)

我有一个Junit测试来测试jms消息发送。我使用Spring jmsTemplate来完成这个任务。在下面的代码中,我想检查JMS模板是否调用了send message,而不管传递的actuall参数的值是什么。
我的publisher方法使用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));

但是当我被处决的时候
组织。模拟。异常。误用。无效使用匹配器异常:参数匹配器的使用无效!....
原因是由于 Mockito.any(MessageCreator.class),但是否有方法测试我的发送方法是否在MessageCreator中未创建实际对象的情况下执行。

更新是否有方法检查我的 * 会话。createObjectMessage(dialogueServiceResponse)* 是否也被调用

a1o7rhls

a1o7rhls1#

我想剩下的信息会告诉你问题是什么,当你为一个参数使用参数匹配器时,所有其他参数也必须使用参数匹配器:

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

ni65a41a2#

供将来的读者使用。这将为您节省大量时间。

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

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

when(fooService.getResult(anyString(),any(MyClass.class))).thenReturn(1); // correct
ghg1uchk

ghg1uchk3#

我认为你不能在stubbing之外使用参数匹配器。我也得到了同样的错误,但是当我返回时,我必须用新的string()代替Mockito.anyString(),错误就消失了。例如:

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

m1m5dgzv4#

我知道这个问题是关于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配置。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)
rm5edbpk

rm5edbpk5#

我看到这个错误是关于不匹配的参数数量,尽管有正确的数量...
我意识到这是因为被stubbed的方法是静态的,当我把它转换成非静态的,它就像预期的那样工作。

mqkwyuun

mqkwyuun6#

只需使用eq Package String值
错误

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

正确

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

相关问题