Mockito ArgumentMatchers doNotMatch?

时间:2016-12-21 19:43:29

标签: java regex mockito matcher

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核心,可以立即使用。

2 个答案:

答案 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());