有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

基于匹配器的java Mockito ArgumentCaptor捕获条件

在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) 个答案

  1. # 1 楼答案

    我在编写测试时经常使用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;
        }
    }
    

    显然,预期参数可能只是一个字符串,或者更复杂的东西,但基本上是检查是否使用与预期参数匹配的参数调用了mock