我有这段代码:
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);
}
答案 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。该匹配器匹配您不存在的参数下次调用when
或verify
,或者如果您使用the Mockito usage validator,则会被MockitoJUnitRunner
抓住。无论哪种方式,这都是一个很好的捕获,因为代码不会对您做什么认为它确实如此。)