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

时间:2017-02-12 11:25:08

标签: java mocking mockito verify

我得到的是这一行:

vector_indexing_suite

...但我希望这个测试无关紧要。我该怎么做?

4 个答案:

答案 0 :(得分:2)

  

the page上,“你可以提取方法”是什么意思,是否可以使用Java 8 lambda来使其成为单行?

使用来自here的不区分大小写代码的单行:

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这样的新类中,并像许多内置匹配器那样从许多测试中调用。

答案 1 :(得分:0)

感谢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;
    }
}

然而,我对我在the page上看到的链接指向的内容感到困惑:
a)他们的意思是“你可以提取方法”和b )是否可以使用Java 8 lambda使其成为单行?

答案 2 :(得分:0)

  

page上,“您可以提取方法”是什么意思,有可能   使用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();
    }
}

答案 3 :(得分:0)

到目前为止,无需编写额外匹配器的最简单方法是使用 matches(String regex) 助手。只需将嵌入的 case insensitive 标志与您的字符串一起使用即可:

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