创建自定义参数匹配器混淆实现



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

我能理解的是一种接受参数并返回 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 中设置匿名接口

相关内容

  • 没有找到相关文章

最新更新