参数匹配器的使用无效! 2匹配预期,1记录:

时间:2015-12-23 04:05:43

标签: android mockito

大家好,我是Mockito的新手,任何人都可以帮助我 在我的情况下,我需要验证handler.sendMessage(msg)

的来电

代码:

//This bundleImportStorage will send message to UI handler by passing message object
bundleImporter.bundleImportFromStorage(intent);

//In this line i am getting error
when(uiHandler.sendMessage(any(Message.class))).thenReturn(true);

异常详情:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
  Invalid use of argument matchers!
  2 matchers expected, 1 recorded:
  -> at com.fio.installmanager.nonui.com.bundleimport.TestBundleImport.testIntentExtras(TestBundleImport.java:69)

  This exception may occur if matchers are combined with raw values:
      //incorrect:
      someMethod(anyObject(), "raw String");
  When using matchers, all arguments have to be provided by matchers.
  For example:
      //correct:
      someMethod(anyObject(), eq("String by matcher"));

1 个答案:

答案 0 :(得分:3)

基于消息“2匹配预期,1记录”,如果UiHandler.sendMessage(Message)是委托给非最终双参数方法的最终方法(通常是同名的重载),则会发生这种情况。这是一个问题,因为如果使用任何匹配器,Mockito坚持每个参数只有一个匹配器。因为最终方法是由static dispatch调用的,并且因为Mockito通过动态覆盖模拟类来工作,所以Mockito的第一个交互是使用双参数方法,它假设你使用单个匹配器进行存根(解释其他方面令人困惑)错误信息)。

如果可行,请确保UiHandler和sendMessage都是公共的和非最终的。如果没有,您可能需要求助于RobolectricPowerMock来覆盖字节码级别的final方法。

我已经写了更多关于Mockito内部的内容,包括每个参数需要一个匹配器,在SO:How do Mockito matchers work?