创建一个自定义参数匹配器令人困惑的实现

时间:2019-06-12 15:16:53

标签: java mockito

我见过有人在创建自定义参数匹配器,如下所示。但是,我很难理解其工作原理。

我能理解的是一个带有参数并返回ArgumentMatcher的方法,该参数是具有List<Person>类型的接口。重写的方法是使用lambda的匹配器。我认为,如果有人可以解释的话,身体部位最令人困惑。

private ArgumentMatcher<List<Person> personListSize(final int size) {
        return argument -> argument.personList().size() == size;
}

这是我通常会做的事情,对我来说更容易理解,只是想知道如何使上面的内容看起来像上面的样子?

public class CustomArgumentMatcher implements ArgumentMatcher<List<Person>> {

    @Override
    public boolean matches(List<Person> argument) {
        return argument.size() == size;
    }
}

刚开始理解,就可以了:

 private ArgumentMatcher<String> stringMatcher = new ArgumentMatcher<String>() {
        @Override
        public boolean matches(String argument) {
            return argument.contains("");
        }
    };

但是,如果我添加一个要像这样传递的参数:

 private ArgumentMatcher<String> stringMatcherArgs(final String name) = new ArgumentMatcher<String>() {
}

我收到一条错误消息,说unexpected token只是想在上面输入一个参数?

3 个答案:

答案 0 :(得分:2)

您应该阅读有关Lambda Expressions

的文档

这是您的示例:

private ArgumentMatcher<List<Person>> customArgumentMatcher(final int size) {
    return argument -> argument.size() == size;
}
private ArgumentMatcher<List<Person>> stringMatcherArgs(final String name) {
    return argument -> argument.contains(name);
}

答案 1 :(得分:1)

你完全正确,只需连接点...

private ArgumentMatcher<List<Person> personListSize(final int size) {
  return new ArgumentMatcher<List<Person>>() {
    @Override
    public boolean matches(List<Person> argument) {
        return argument.size() == size;
    }
  };
}

并与 argThat

一起使用
Mockito.verify(mockClass).foo(argThat(personListSize(5));

答案 2 :(得分:0)

如果您仍在寻找相当于古斯塔沃答案的kotlin (请注意,您应该创建另一个问题),

尝试以下操作:

fun customArgumentMatcher(size : Int) :  ArgumentMatcher<List<Person>> {
    return object : ArgumentMatcher<List<Person>> {
        override fun matches(argument : List<Person>) = argument.size == size;
    }
}

另请参阅: Setting anonymous interface in Kotlin