Mockito异常:org.mockito.exceptions.misusing.InvalidUseOfMatchersException

时间:2013-08-14 07:57:23

标签: java mockito

我有这段代码:

import static org.mockito.Mockito.*;

final Combobox combobox = mock(Combobox.class);

//.... some business logic which calls method 'appendChild' on 'combobox'

verify(combobox, times(3)).appendChild((Component) anyObject()); // <<== exception here

它一直在写这个:

Invalid use of argument matchers!
2 matchers expected, 1 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.  

appendChild方法如下所示:

public final boolean appendChild(Component child)
{
     return insertBfr(null, child);
}

1 个答案:

答案 0 :(得分:2)

appendChild是最终方法,表示you can't mock or verify it。 Java编译器理解“final”意味着它可以确定它正在调用哪个实际方法实现,这意味着它需要一个快捷方式直接调用该代码,而不是允许Mockito潜入并替换实现。一般来说,这是人们推荐not to mock types you don't own or control的一个很好的理由。

重构您的测试,或使用PowerMockito执行深度字节码魔术来模拟这些最终方法。

为什么会出现这种情况?匹配actually affect static state in Mockito。因为您在该行上调用了anyObject,Mockito仍然是registers a Matcher。该匹配器匹配您不存在的参数下次调用whenverify,或者如果您使用the Mockito usage validator,则会被MockitoJUnitRunner抓住。无论哪种方式,这都是一个很好的捕获,因为代码不会对您做什么认为它确实如此。)