2016-12-21 39 views
1

ArgumentMatchers.matches(String regex)存在...並且有可能設計正則表達式,其中不與匹配給定的String。但這遠非微不足道(SO中的幾個主題)。Mockito ArgumentMatchers doesNotMatch?

想要讓Mockito的設計師從這件事中脫穎而出並添加它作爲一個功能,可能是不錯的想法嗎?這似乎是,在嘲笑等情況下,這是一個非常例外的用例...

PS也,我不清楚與ArgumentMatchers.matches你怎麼去說「這可能是我們正在匹配的多行字符串,不用擔心「......難道不是Pattern而不是簡單的String

Feature request 「增強的」 在HQ的Mockito(Github上)。 「bric3」說那裏應該使用Jeff Bowman的技術來「不匹配」。但她/他似乎認爲Pattern的想法值得思考。

重新not():的Mockito的own documentation說:「使用額外的匹配非常明智的,因爲它們可能會影響測試的可讀性,建議從匹配器使用的匹配,並保持磕碰和驗證簡單。」

另外我發現我必須「可能欺騙」我自己的問題:How to write a matcher that is not equal to something。用事後搜索總是比較容易......!

後來還是

非常感謝柯那麼趕快加入這一點。更新了我的gradle.build和...從Maven Central下載的新4.1核心,並立即可供使用。

+1

這將是該郵件的Mockito列表中的優秀文章。而且您可以隨時向Mockito團隊發送功能請求。功能要求通常會引發團隊內部關於功能是否是個好主意的爭論 - 有時要求的功能開發得很快,有時需要一段時間但最終得到開發,有時會被拒絕。但是在提出請求時沒有任何傷害。 –

+0

感謝您的鼓勵。傑夫鮑曼的迴應是完全不同的方向。 AdditionalMatchers.not。我認爲這可能會讓我花費大約13年的時間來解決這個問題。可能只有一小部分潛在購買者,但是有沒有專家曾想過寫一本名爲「Intermediate Mockito」或「Mockito:將它帶到另一個級別」的書? –

+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

我可用。還要感謝我們的自動發佈流程。 – Brice