2016-12-21 4 views
1

ArgumentMatchers.matches(String regex)が存在し... と一致しない正規表現を作成することが可能です。Stringと一致します。しかしそれは些細ではありません(SOのいくつかのスレッド)。Mockito ArgumentMatchers doesNotMatch?

Mockitoのデザイナーにこれを重く持ち上げて機能として追加してもらうことをお勧めすると、間違っていると思いますか?嘲笑などの文脈では、それは例外的なユースケースです。

PSまた、私は明確ではありませんArgumentMatchers.matchesあなたは「これが私たちが照合している複数行の文字列について、心配しないでください... "StringではなくPatternを持つ方が良いでしょうか?

後で

Feature request(Githubの上)Mockito HQで "強化"。 「bric3」は、「一致しない」というジェフ・ボウマンの技術を使うべきだと言っています。しかし彼女/彼はPatternアイデアが考える価値があると思うようだ。

not():Mockitoのown documentationは「彼らはテストの可読性に影響を与える可能性があるため、非常に慎重に追加マッチャーを使用マッチャーからマッチャを使用し、スタブと検証シンプルに保つことをお勧めします。」と言います

また、私は自分自身の質問に「可能性があります」と述べなければなりません。How to write a matcher that is not equal to something。後ろ向きで検索することは常に簡単です...!

後でまだ

ので、すぐにこれを追加するためのブライスに感謝します。 Maven Centralからダウンロードしたmy gradle.buildと...新しい4.1コアを直ちに使用できるようになりました。

+1

これはMockitoのメーリングリストのための優れたポストだろう。そして、あなたはいつもMockitoチームに機能要求を出すことができます。機能リクエストは、通常、チーム内で機能が良いアイデアかどうかについて議論を巻き起こします。要求された機能がすぐに開発され、時には時間がかかり、最終的に開発され、時には却下されることもあります。しかし、要求をすることに害はありません。 –

+0

励ましてくれてありがとう。ジェフ・ボウマンの反応はまったく異なる方向に向かいます。 AdditionalMatchers.not。私はそれがつまずいたのは約13年かかったと思う。潜在的な購買者はほんの少ししかないかもしれませんが、あなたの専門家の中には、「中級モキト」または「モキト:別のレベルに持っていく」という本を書くことを考えたことがありますか? –

+0

実際、私は数年前にMockitoに関するかなり包括的な本で作業を始めました。問題は、Mockitoが成長しており、私が書くことができるよりも速く変化していることです。新しい機能が常に追加されています。私が出版しようとするとき、私の本の情報は古いだろう。だからプロジェクトを中止しました。私が本当にしなければならないことは、ブログを始めて自分の資料を一連の投稿に変えることです。 –

答えて

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()); 
+0

ブリリアント!ありがとう、ジェフ、あなたはすべてのもののために行く人Mockitoです! –

3

Mockito 2.4.1は、Patternクラスのサポートでリリースされました。

今、あなたは書くことがabbleする必要があります:

when(yourComponent.acceptString(not(matches(Pattern.compile(...))) 
    .thenThrow(new IllegalArgumentException()); 
+2

その1つの印象的なタイミング! –

+1

私は利用可能でした。私たちの自動リリースプロセスにも感謝します。 – Brice