如何让匹配器匹配模拟的第二次调用?

时间:2013-07-02 14:30:44

标签: mocking testng mockito

我有这样的界面

 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()));

匹配第二次调用?

1 个答案:

答案 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,虽然它在内部包中。)