Mockito ArgumentCaptor捕获有条件的匹配器

时间:2015-08-13 18:01:59

标签: java mockito

在mockito中,我们可以捕获可能被多次调用的方法的参数:

verify(mocked, atLeastOnce())
    .myMethod(myCaptor.capture());

然后

myCaptor.getAllValues()

然而,我需要筛选所有捕获的值,以找到我感兴趣的用于验证的值。

我想做的是这样的事情:

private class IsMySpecialArg extends ArgumentMatcher<Object> {
  public boolean matches(Object other) {
    // Matching condition
  }
}

...

verify(mocked, atLeastOnce())
        .myMethod(myCaptor.capture(argThat(new IsMySpecialArg()));

这样我就可以简单地调用myCaptor.getValue()并确保它指的是我实际上有兴趣捕获的参数。实现这一目标的最佳方法是mockito,是否支持,或者我的测试策略存在根本错误?

1 个答案:

答案 0 :(得分:0)

我在编写测试时经常使用ArgumentMatchers。以下是验证传递给模拟对象的参数时可以执行的操作的示例:

private static class ExpectationArgumentMatcher extends ArgumentMatcher<String> {

    private final List<String> expectedArguments;

    public ExpectationArgumentMatcher(List<String> expectedArguments) {
        this.expectedArguments = expectedArguments;
    }

    public ExpectationArgumentMatcher() {
        this(new ArrayList<javax.swing.Action>());
    }


    @Override
    public boolean matches(Object argument) {
        if (argument instanceof String) {
            String actualArgument = (String) argument;
            return expectedArguments.contains(actualArgument);
        }
        return false;
    }
}

显然,你预期的参数可能只是一个字符串,或者更复杂的东西,但是你基本上都在检查你的模拟是否被调用了一个与你期望的参数匹配的参数。 / p>