Mockito 验证参数包含另一个忽略大小写的字符串

mik*_*ent 6 java mocking verify mockito

我得到的是这一行:

verify( mockAppendable ).append( org.mockito.Mockito.contains( msg ) );
Run Code Online (Sandbox Code Playgroud)

...但我希望这个测试不分大小写。我该怎么做?

wes*_*ton 6

页面上,“您可以提取方法”是什么意思,是否可以使用 Java 8 lambda 使其成为单行?

在一行中使用此处不区分大小写的代码:

verify(mockAppendable)
    .append(
       argThat(arg ->
         Pattern.compile(Pattern.quote(msg), Pattern.CASE_INSENSITIVE).matcher(arg).find()));
Run Code Online (Sandbox Code Playgroud)

因此,他们通过跳过指定自定义错误消息来允许 lambda 版本。

而“你可以提取一个方法”,他们的意思是:

verify(mockAppendable).append(argThat(containsCaseInsensitive(msg)));
Run Code Online (Sandbox Code Playgroud)

该方法定义为:

public static ArgumentMatcher<String> containsCaseInsensitive(final string s) {
    if (s == null) throw new IllegalArgumentException("s is null");
    final Pattern pattern = Pattern.compile(Pattern.quote(s), Pattern.CASE_INSENSITIVE);
    return new ArgumentMatcher<String>() {

        @Override
        public boolean matches(String arg) {
            return arg != null && pattern.matcher(arg).find();
        }

        @Override 
        public String toString() {
            return String.format("[should have contained, ignoring case, \"%s\"]", s);
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

这是完全可重用的,你可以把它放在一个像 MocitoMatchers 这样的新类中,并像任何内置匹配器一样从许多测试中调用。