我一直试图调试这段代码一段时间但仍然没有运气。我继续专门为此代码抛出“InvalidUseOfMatchersException”:
对于设置:
service = mock(Service.class);
newRequest = mock(Request.class);
when(service.newRequest(anyString(), anyString(), anyString())).thenReturn(
newRequest);
在使用服务的类中:
Request newRequest = Service.newRequest(
mId, "mp", itemID);
我假设它失败了,因为我在when ... thenReturn子句中传入3“anyString()”但它可能是因为它在硬编码的“mp”上失败了。所以我试着用这个替换when子句:
when(service.newRequest(anyString(), eq("mp"), anyString())).thenReturn(
newRequest);
但仍然收到InvalidUseOfMatchersException。
我是否遗漏了有关mockito应该如何为此工作的事情?
完整筹码:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
3 matchers expected, 2 recorded.
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"));
For more info see javadoc for Matchers class.
at ServiceFacade.getSimilarities(ServiceFacade.java:29)
at FacadeTest.getSimilarities(FacadeTest.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodImpl.invoke(DelegatingMethodImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
答案 0 :(得分:0)
基于以下语法:
Service.newRequest(mId, "mp", itemID);
看起来newRequest
是一种静态方法。 Mockito固有地通过子类化(实际上生成动态代理)来工作,因此它不能处理静态方法,因为静态方法不能通过子类化来覆盖。由于类似的原因,最终方法不可模仿。
如果这是正确的,切换到工厂对象而不是工厂方法,这将允许您模拟工厂的实例,或使用Powermock来模拟静态字段。