我见过有人在创建自定义参数匹配器,如下所示。但是,我很难理解其工作原理。
我能理解的是一个带有参数并返回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
只是想在上面输入一个参数?
答案 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;
}
}