0

我有这个代码:

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);
}
4

1 回答 1

2

appendChild是最终方法,这意味着您不能模拟或验证它。Java 编译器将“final”理解为意味着它可以确定它正在调用哪个实际方法实现,这意味着它可以通过快捷方式直接调用该代码,而不是让 Mockito 潜入并替换实现。一般来说,这是人们建议不要模拟您不拥有或控制的类型的一个很好的原因。

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

为什么会出现这个异常?匹配器实际上会影响 Mockito 中的静态状态。因为您anyObject在该行上调用,Mockito 仍会注册一个 Matcher。该 Matcher 在您下次调用whenor时匹配一个不存在的参数,或者如果您使用Mockito 使用验证器verify,则会被捕获. 无论哪种方式,这都是一个很好的收获,因为代码并没有按照你的想法去做。)MockitoJUnitRunner

于 2013-08-15T15:58:10.617 回答