ArgumentMatchers.matches( String regex )
存在...并且可以设计不匹配给定String
的正则表达式。但它远非微不足道(SO中的几个主题)。
我认为要求Mockito设计师从中获取重量并将其添加为功能可能是个不错的选择(或者是错误的想法)?看来,在嘲讽等情况下,这是一个非常特殊的用例......
PS也是,我不清楚ArgumentMatchers.matches
你如何说"这可能是一个我们要匹配的多线字符串,不用担心它和&#34} #34; ...最好是Pattern
而不是简单的String
?
后
Feature request"增强"在Mockito总部(在Github上)。 " bric3"有人说应该使用杰夫鲍曼的技术,#34;不匹配"。但她/他似乎认为Pattern
这个想法值得思考。
重新not()
:Mockito的own documentation说"非常明智地使用其他匹配器,因为它们可能会影响测试的可读性。建议使用Matchers的匹配器,并保持简单和验证简单。"
此外,我发现我必须"可能的欺骗"我自己的问题:How to write a matcher that is not equal to something。事后回顾总是更容易......!
以后仍然
非常感谢Brice如此迅速地加入这一点。更新了我的gradle.build和...从Maven Central下载的新4.1核心,可以立即使用。
答案 0 :(得分:4)
无需请求:您可以使用AdditionalMatchers.not撰写您想要的内容。
when(yourComponent.acceptString(not(matches("foo|ba[rz]"))))
.thenThrow(new IllegalArgumentException());
如果你想匹配一个模式,你可能需要编写自己的ArgumentMatcher子类,但从那里它很容易:
public class MatchesPattern implements ArgumentMatcher<String> {
private final Pattern pattern;
public MatchesPattern(Pattern pattern) { this.pattern = pattern; }
@Override public boolean matches(String string) {
return pattern.matcher(string).matches();
}
@Override public String toString() {
return "[string matching /" + pattern.toString() + "/]";
}
/** Optional. */
public static MatchesPattern matchesPattern(Pattern pattern) {
return new MatchesPattern(pattern);
}
}
然后您可以使用以下方式使用该类:
when(yourComponent.acceptString(not(argThat(new MatchesPattern(yourPattern)))
.thenThrow(new IllegalArgumentException());
// or with the static factory method:
when(yourComponent.acceptString(not(argThat(matchesPattern(yourPattern)))
.thenThrow(new IllegalArgumentException());
答案 1 :(得分:4)
对于未来的读者,Mockito 2.4.1已在Pattern
类的支持下发布:
现在你应该能够写下来了:
when(yourComponent.acceptString(not(matches(Pattern.compile(...)))
.thenThrow(new IllegalArgumentException());