我需要验证对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"));
根据消息"预期2个匹配器,记录1个",如果UiHandler.sendMessage(Message)
是委托给非最终双参数方法(通常是同名重载)的最终方法,则可能发生这种情况。这是一个问题,因为Mockito坚持每个参数只有一个匹配器,如果使用任何匹配器的话。由于final方法是由静态调度调用的,而且Mockito是通过动态重写mocked类来工作的,因此Mockito的第一个交互是使用一个双参数方法,它假设您正在使用一个匹配器进行存根处理(解释其他令人困惑的错误消息)。
如果可行,请确保UiHandler和sendMessage都是公共的和非最终的。如果没有,您可能需要使用Robolectric或PowerMock来覆盖字节码级别的final
方法。
我在SO上写了更多关于Mockito内部的内容,包括每个参数需要一个匹配器:Mockito匹配器是如何工作的?