Mockito 验证参数包含另一个忽略大小写的字符串
Mockito verify argument contains another string ignoring case
我得到的是这一行:
verify( mockAppendable ).append( org.mockito.Mockito.contains( msg ) );
...但我希望这个测试不区分大小写。我该怎么做?
感谢 JB Nizet,我发现答案似乎是这样的 class:
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 上看到他的 link 指向的内容感到困惑:
a) "you can extract method" 是什么意思
b) 是否可以使用 Java 8 lambda 使其成为 one-liner?
On the page, what do they mean by "you can extract method" and is it possible to use a Java 8 lambda to make this a one-liner?
在一行中使用来自 here:
的不区分大小写的代码
verify(mockAppendable)
.append(
argThat(arg ->
Pattern.compile(Pattern.quote(msg), Pattern.CASE_INSENSITIVE).matcher(arg).find()));
因此他们通过跳过指定自定义错误消息来允许使用 lambda 版本。
"you can extract a method" 表示:
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);
}
};
}
这是完全可重复使用的,您可以将其放入新的 class 中,例如 MocitoMatchers,并像任何 built-in 匹配器一样从许多测试中调用。
On the page, what do they mean by "you can extract method" and is it possible to
use a Java 8 lambda to make this a one-liner?
这只是意味着您不必将 new ListOfTwoElements()
放入您的测试代码中,您可以向您的测试 class 添加一个名为 listOfTwoElements()
的方法,该方法 returns新的 ListOfTwoElements 对象,使测试代码更流畅。
要回答有关将其设为单线的问题,更重要的是,要回答此帖子的原始问题,您可以使用 Hamcrest 库中的 MockitoHamcrest from the core Mockito library and IsEqualIgnoringCase 来获得单线,而无需自定义class 或 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(String regex) helper. Just use the embedded case insensitive 标志,您可以开始了:
verify( mockAppendable ).append( matches("(?i)the-message") );
我得到的是这一行:
verify( mockAppendable ).append( org.mockito.Mockito.contains( msg ) );
...但我希望这个测试不区分大小写。我该怎么做?
感谢 JB Nizet,我发现答案似乎是这样的 class:
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 上看到他的 link 指向的内容感到困惑:
a) "you can extract method" 是什么意思
b) 是否可以使用 Java 8 lambda 使其成为 one-liner?
On the page, what do they mean by "you can extract method" and is it possible to use a Java 8 lambda to make this a one-liner?
在一行中使用来自 here:
的不区分大小写的代码verify(mockAppendable)
.append(
argThat(arg ->
Pattern.compile(Pattern.quote(msg), Pattern.CASE_INSENSITIVE).matcher(arg).find()));
因此他们通过跳过指定自定义错误消息来允许使用 lambda 版本。
"you can extract a method" 表示:
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);
}
};
}
这是完全可重复使用的,您可以将其放入新的 class 中,例如 MocitoMatchers,并像任何 built-in 匹配器一样从许多测试中调用。
On the page, what do they mean by "you can extract method" and is it possible to use a Java 8 lambda to make this a one-liner?
这只是意味着您不必将 new ListOfTwoElements()
放入您的测试代码中,您可以向您的测试 class 添加一个名为 listOfTwoElements()
的方法,该方法 returns新的 ListOfTwoElements 对象,使测试代码更流畅。
要回答有关将其设为单线的问题,更重要的是,要回答此帖子的原始问题,您可以使用 Hamcrest 库中的 MockitoHamcrest from the core Mockito library and IsEqualIgnoringCase 来获得单线,而无需自定义class 或 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(String regex) helper. Just use the embedded case insensitive 标志,您可以开始了:
verify( mockAppendable ).append( matches("(?i)the-message") );