我需要验证对 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)
是一个 final方法,它委托(delegate)给一个非最终的双参数方法(通常同名的重载)。这是一个问题,因为 Mockito 坚持每个参数只有一个匹配器,如果使用任何匹配器的话。因为 final 方法由 static dispatch 调用,并且因为 Mockito 通过动态覆盖模拟类来工作,所以 Mockito 的第一个交互是使用一个双参数方法,它假设您使用单个匹配器 stub (解释否则令人困惑的错误消息)。
如果可行,确保 UiHandler 和 sendMessage 都是公共(public)的和非最终的。如果没有,您可能需要求助于 Robolectric或 PowerMock在字节码级别覆盖 final
方法。
我已经写了更多关于 Mockito 内部结构的文章,包括每个参数需要一个匹配器,在 SO 上:How do Mockito matchers work?
我是一名优秀的程序员,十分优秀!