Mockito匹配器优先
這篇文章是意見。
讓我們看一下Mockito中用于在Java中進(jìn)行測(cè)試的verify方法。
示例: verify(myMock).someFunction(123) –期望在模擬ONCE上使用輸入123調(diào)用someFunction 。
BDDMockito ,我更喜歡完整的BDDMockito替代方案,因此請(qǐng)編寫then(myMock).should().someFunction(123) 。
相同的基本概念。
三種匹配方法
您可以通過三種不同的機(jī)制將值提供給驗(yàn)證功能鏈:
- 對(duì)象/文字價(jià)值
- 參數(shù)匹配器
- 爭(zhēng)吵者
我認(rèn)為,上述也是優(yōu)先次序,而綁架者是不得已而為之。 讓我們探討一下機(jī)制。
具體的測(cè)試是最好的
理想情況下,您在理論上將測(cè)試定義為類似的內(nèi)容- 給定此輸入,當(dāng)系統(tǒng)運(yùn)行時(shí),輸出為X。 在驗(yàn)證出站函數(shù)調(diào)用時(shí),我們冒著測(cè)試存在實(shí)現(xiàn)線的風(fēng)險(xiǎn),而不是測(cè)試行為,但是可以合理地說,如果系統(tǒng)運(yùn)行正常,那么我們期望某些事情會(huì)發(fā)生。發(fā)送到某個(gè)目標(biāo)或其他目標(biāo)。
通常,如果我們將模塊設(shè)計(jì)為具有清晰的輸入和清晰的可測(cè)量的輸出,則可以預(yù)測(cè)給定輸入應(yīng)輸出的內(nèi)容。
例:
EmailBuilder builder = new EmailBuilder(mockEmailObject); builder.setRecipients( "me@you.com, him@her.com, it@them.com" ); then(mockEmailObject) .should() .addRecipient( "me@you.com" ); then(mockEmailObject) .should() .addRecipient( "him@her.com" ); then(mockEmailObject) .should() .addRecipient( "it@them.com" );注意:在這里我沒有告訴您有關(guān)周圍代碼的任何信息,但是我猜您可以從簡(jiǎn)單測(cè)試中讀取setRecipients的預(yù)期行為。
這就是為什么具體的測(cè)試數(shù)據(jù)在測(cè)試中占了上風(fēng),并且是我們的第一個(gè)也是最簡(jiǎn)單的方法。
當(dāng)數(shù)據(jù)不重要時(shí)
有時(shí)候,我們所關(guān)心的并不是輸入的價(jià)值,而是它的性質(zhì)。 在上面的示例中,也許我們的某些測(cè)試可以跳過使用的電子郵件地址,而是關(guān)注更高級(jí)別的關(guān)注,例如是否撥打了電話或打了多少電話。
如果我在單元測(cè)試中看到了這一點(diǎn),我不會(huì)感到震驚:
verify(mockEmailObject, times( 3 )).addRecipient(anyString());這里使用了一個(gè)參數(shù)匹配器來進(jìn)行更模糊的斷言,但這也許就足夠了。 將所有內(nèi)容鎖定為具體數(shù)據(jù)可以使測(cè)試更加脆弱,盡管對(duì)于需要清晰的輸入/輸出映射的低級(jí)算法來說值得這樣做,但可以將其降為更高的模糊斷言,因?yàn)槟槐負(fù)?dān)心關(guān)于確切的值。
我們可以在這里使用Mockito的argThat 。
verify(mockEmailObject, times( 3 )) .addRecipient(argThat(recipient -> recipient.matches( "[az]+@[az]+\\.com" )));argThat匹配器使我們可以使用Java Predicate來提供有關(guān)期望的一些邏輯。 這使我們能夠在此處使用正則表達(dá)式來檢查電子郵件地址是否正確(在此測(cè)試數(shù)據(jù)的范圍內(nèi))。 此技巧對(duì)于使用GUID或時(shí)間戳等生成的值進(jìn)行測(cè)試非常有用。
我們還可以使用argThat從輸入中選擇字段進(jìn)行檢查。
但是,當(dāng)您要對(duì)發(fā)送到模擬函數(shù)的對(duì)象進(jìn)行復(fù)雜的斷言時(shí),本能是使用ArgumentCaptors 。 我仍然認(rèn)為它們是不得已的方法。
著迷的俘虜
讓我們使用ArgumentCaptor解決電子郵件正則表達(dá)式問題。
// in the instance variable section of the test: @Captor // assuming you're using MockitoExtension/MockitoJUnitRunner... DO! private ArgumentCaptor<String> stringCaptor; @Mock private Email mockEmailObject; @Test void whenAddingRecipientsFromToLine_thenEachIsAddedSeparately() { void EmailBuilder builder = new EmailBuilder(mockEmailObject); builder.setRecipients( "me@you.com, him@her.com, it@them.com" ); then(mockEmailObject) .should(times( 3 )) .addRecipient(stringCaptor.capture()); stringCaptor.getAllValues() .forEach(value -> assertThat(value).matches( "[az]+@[az]+\\.com" ); }在某些文章中,以上內(nèi)容是討論的結(jié)局。 飽經(jīng)風(fēng)霜的例子。 哇。 看看它是如何構(gòu)成驚人的創(chuàng)造物的! 但…
盡管以上內(nèi)容確實(shí)說明了如何使用捕獲程序,并向您展示了如何拔出所有呼叫或一個(gè)呼叫,然后使用自己喜歡的斷言庫對(duì)它進(jìn)行任何喜歡的斷言,以及如何將其與前兩個(gè)進(jìn)行比較例子。
比較方式
具體的例子是:
- 叫什么時(shí)候
- 然后您得到價(jià)值為A的電話
- 還有一個(gè)值B
- 還有一個(gè)值C
匹配器示例具有:
- 叫什么時(shí)候
- 然后,您將獲得三個(gè)與此表達(dá)式匹配的電話
參數(shù)捕獲示例為:
- 叫什么時(shí)候
- 然后您會(huì)接到三個(gè)電話– 記住他們
- 當(dāng)您檢查這些調(diào)用的值時(shí)
- 然后他們匹配這些斷言
注意:后面的測(cè)試在參數(shù)捕獲時(shí)口吃。 接下來的步驟需要檢查提取的參數(shù), 然后再進(jìn)行一些提取操作。 因此,它是一種用于特定目的的工具,其中將斷言嵌入argThat或內(nèi)置的匹配器之一不夠強(qiáng)大,或者沒有提供有意義的測(cè)試失敗輸出。
翻譯自: https://www.javacodegeeks.com/2020/04/mockito-matchers-precedence.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Mockito匹配器优先的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate字节码增强
- 下一篇: junit:junit_简而言之,JUn