我有这样的界面
public interface EventBus{
public void fireEvent(GwtEvent<?> event);
}
和测试代码(testng方法)如下所示:
@Test
public void testFireEvent(){
EventBus mock=mock(EventBus.class);
//when both Event1 and Event2 are subclasses of GwtEvent<?>
mock.fireEvent(new Event1());
mock.fireEvent(new Event2());
//then
verify(mock).fireEvent(argThat(new Event2Matcher()));
}
Event2Matcher看起来像这样:
private class Event2Matcher extends ArgumentMatcher<Event2>
{
@Override
public boolean matches(Object arg)
{
return ((Event2) arg).getSth==sth;
}
}
但是得到一个错误,表明:
Event1 can't be cast to Event2
显然,匹配器匹配第一个调用
mock.fireEvent(new Event1());
所以,matcher中的声明
return ((Event2) arg).getSth==sth;
将抛出此异常。所以问题是如何让
verify(mock).fireEvent(argThat(new Event2Matcher()));
匹配第二次调用?
答案 0 :(得分:0)
matches()
方法返回一个布尔值以指示它是否匹配。您需要做的就是在尝试强制转换之前确保在参数不相关时返回false。
我会发生短路,如下所示:
private class Event2Matcher extends ArgumentMatcher<Event2> {
@Override public boolean matches(Object arg) {
return arg instanceof Event2 && ((Event2) arg).getSth==sth;
}
}
...或者扩展TypeSafeMatcher
in the Hamcrest package代替,它会为您执行空检查和转换。 (有一个类似的类included in JUnit since 4.5,虽然它在内部包中。)