日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mockito匹配器优先

發(fā)布時(shí)間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mockito匹配器优先 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這篇文章是意見。

讓我們看一下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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。