我见过有人创建自定义参数匹配器,如下所示。但是,我很难理解它是如何工作的。
我能理解的是一种接受参数并返回 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
只是想知道在上面传递一个参数?
您应该阅读有关 Lambda 表达式的文档
以下是您的示例:
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);
}
你做对了,只是连接点...
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));
如果您仍在寻找古斯塔沃答案的 kotlin 等价物(请注意,您应该创建另一个问题(,
请尝试以下操作:
fun customArgumentMatcher(size : Int) : ArgumentMatcher<List<Person>> {
return object : ArgumentMatcher<List<Person>> {
override fun matches(argument : List<Person>) = argument.size == size;
}
}
另请参阅:在 Kotlin 中设置匿名接口