【问题标题】:How to match the second invocation on mock?如何匹配模拟上的第二次调用?
【发布时间】:2013-06-26 12:29:30
【问题描述】:

如下图,我想查看 mock.fireEvent() 是否被特定事件调用(此处为 event2)

mock.fireEvent(event1);

mock.fireEvent(event2);

verify(mock).fireEvent(matcherToCheckTheFieldOfEvent2);

但是得到一个错误提示

  verify(mock).fireEvent(matcherToCheckTheFieldOfEvent2);

将尝试匹配第一个调用

  mock.fireEvent(argThat(event1));

问题是如何让event2得到匹配?

Matcher 看起来像这样:

    private class IsEvent2 extends ArgumentMatcher<Event2>
    {
      @Override
      public boolean matches(Object arg)
      {
                return ((Event2) arg).methodGotCalled();
      }
    }

【问题讨论】:

  • 能否请您添加您收到的确切错误消息?添加更多的junit测试代码也会有所帮助。
  • 完整的测试代码很多,主要思想是捕获事件的类型是Event1,不能转换为Event2,我添加了Matcher代码

标签: mockito matcher


【解决方案1】:

这是一个旧线程,但我最近遇到了这个问题,并通过使用 ArgumentCaptor 捕获触发事件列表并断言列表中存在预期事件来解决它。

ArgumentCaptor<SomeEvent> argument = ArgumentCaptor.forClass(SomeEvent.class);
verify(mock, times(2)).fire(argument.capture());

argument 然后会有一个捕获的事件列表,您可以单独声明它们

assertThat(argument.getAllValues(), hasItems(
    new SomeEventMatcher(event1),
    new SomeEventMatcher(event2)
));

匹配器看起来像这样:

static class SomeEventMatcher extends ArgumentMatcher<SomeEvent> {
    private SomeEvent expected;

    public SomeEventMatcher(SomeEvent expected) {
        this.expected = expected;
    }

    @Override
    public boolean matches(Object argument) {
        if (argument == null) {
            return false;
        }
        else {
            SomeEvent event = (SomeEvent) argument;
            // the fields that you want to compare with the matcher
            return new EqualsBuilder()
                    .append(expected.getField1(), event.getField1())
                    .append(expected.getField2(), event.getField2())
                    .build();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-09
    • 2012-07-31
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2018-07-10
    相关资源
    最近更新 更多