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



我得到的是这一行:

verify( mockAppendable ).append( org.mockito.Mockito.contains( msg ) );

。但我希望这个测试是无动于衷的。我该怎么做?

在页面上,"您可以提取方法"是什么意思,是否可以使用 Java 8 lambda 将其设置为单行代码?

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

verify(mockAppendable)
    .append(
       argThat(arg ->
         Pattern.compile(Pattern.quote(msg), Pattern.CASE_INSENSITIVE).matcher(arg).find()));

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

通过"您可以提取方法",它们的意思是:

verify(mockAppendable).append(argThat(containsCaseInsensitive(msg)));

该方法定义为:

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);
        }
    };
}

这是完全可重用的,您可以将其放入像MocitoMatchers这样的新类中,并像任何内置匹配器一样从许多测试中调用。

多亏了

JB Nizet,我发现答案似乎是这样的类:

class ContainsThisIgnoringCase implements ArgumentMatcher<String> {
    private String msg;
    ContainsThisIgnoringCase( String msg ){
        this.msg = msg;
    }
    @Override
    public boolean matches(String arg ) {
        return arg.toLowerCase().contains( msg.toLowerCase() );
    }
    @Override 
    public String toString(){
        return msg;
    }
}

但是,我对我在他的链接指向的页面上看到的内容感到困惑:
a("您可以提取方法"是什么意思,
b(是否可以使用Java 8 lambda将其设置为单行代码?

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

这只是意味着,您不必在测试代码中放入new ListOfTwoElements(),而是可以向测试类添加一个名为 listOfTwoElements() 的方法,该方法返回一个新的 ListOfTwoElements 对象以使测试代码更流畅。

要回答

您关于将其设为单行代码的问题,更重要的是,要回答本文的原始问题,您可以使用核心 Mockito 库中的 MockitoHamcrest 和 Hamcrest 库中的 IsEqualIgnoringCase 来获取单行代码,而无需自定义类或 lambda:

import static org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase;
import static org.mockito.Mockito.when;
import static org.mockito.hamcrest.MockitoHamcrest.argThat;
class CookieUtilTest {
    @Mock
    private HttpServletResponse response;
    @Test
    public void testHasCookiesDoesNotMatchCaseSensitiveCookieName() {
        when(response.getHeaders(argThat(equalToIgnoringCase("Set-Cookie")))).thenReturn(singletonList("CookieNames=AreCaseSensitive"));
        boolean testValue = CookieUtil.hasCookie("cookieNames", response);
        verify(response).getHeaders(argThat(equalToIgnoringCase("Set-Cookie")));
        assertThat(testValue).isFalse();
    }
}

到目前为止,不编写额外匹配器的最简单方法是使用 matches(字符串正则表达式(帮助程序。只需在字符串中使用嵌入的不区分大小写标志,您就可以开始了:

verify( mockAppendable ).append( matches("(?i)the-message") );

相关内容

  • 没有找到相关文章

最新更新