Mockito匹配器优先
這篇文章是意見。
讓我們看一下Mockito中用于在Java中進行測試的verify方法。
示例: verify(myMock).someFunction(123) –期望在模擬ONCE上使用輸入123調用someFunction 。
BDDMockito ,我更喜歡完整的BDDMockito替代方案,因此請編寫then(myMock).should().someFunction(123) 。
相同的基本概念。
三種匹配方法
您可以通過三種不同的機制將值提供給驗證功能鏈:
- 對象/文字價值
- 參數匹配器
- 爭吵者
我認為,上述也是優先次序,而綁架者是不得已而為之。 讓我們探討一下機制。
具體的測試是最好的
理想情況下,您在理論上將測試定義為類似的內容- 給定此輸入,當系統運行時,輸出為X。 在驗證出站函數調用時,我們冒著測試存在實現線的風險,而不是測試行為,但是可以合理地說,如果系統運行正常,那么我們期望某些事情會發生。發送到某個目標或其他目標。
通常,如果我們將模塊設計為具有清晰的輸入和清晰的可測量的輸出,則可以預測給定輸入應輸出的內容。
例:
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" );注意:在這里我沒有告訴您有關周圍代碼的任何信息,但是我猜您可以從簡單測試中讀取setRecipients的預期行為。
這就是為什么具體的測試數據在測試中占了上風,并且是我們的第一個也是最簡單的方法。
當數據不重要時
有時候,我們所關心的并不是輸入的價值,而是它的性質。 在上面的示例中,也許我們的某些測試可以跳過使用的電子郵件地址,而是關注更高級別的關注,例如是否撥打了電話或打了多少電話。
如果我在單元測試中看到了這一點,我不會感到震驚:
verify(mockEmailObject, times( 3 )).addRecipient(anyString());這里使用了一個參數匹配器來進行更模糊的斷言,但這也許就足夠了。 將所有內容鎖定為具體數據可以使測試更加脆弱,盡管對于需要清晰的輸入/輸出映射的低級算法來說值得這樣做,但可以將其降為更高的模糊斷言,因為您不必擔心關于確切的值。
我們可以在這里使用Mockito的argThat 。
verify(mockEmailObject, times( 3 )) .addRecipient(argThat(recipient -> recipient.matches( "[az]+@[az]+\\.com" )));argThat匹配器使我們可以使用Java Predicate來提供有關期望的一些邏輯。 這使我們能夠在此處使用正則表達式來檢查電子郵件地址是否正確(在此測試數據的范圍內)。 此技巧對于使用GUID或時間戳等生成的值進行測試非常有用。
我們還可以使用argThat從輸入中選擇字段進行檢查。
但是,當您要對發送到模擬函數的對象進行復雜的斷言時,本能是使用ArgumentCaptors 。 我仍然認為它們是不得已的方法。
著迷的俘虜
讓我們使用ArgumentCaptor解決電子郵件正則表達式問題。
// 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" ); }在某些文章中,以上內容是討論的結局。 飽經風霜的例子。 哇。 看看它是如何構成驚人的創造物的! 但…
盡管以上內容確實說明了如何使用捕獲程序,并向您展示了如何拔出所有呼叫或一個呼叫,然后使用自己喜歡的斷言庫對它進行任何喜歡的斷言,以及如何將其與前兩個進行比較例子。
比較方式
具體的例子是:
- 叫什么時候
- 然后您得到價值為A的電話
- 還有一個值B
- 還有一個值C
匹配器示例具有:
- 叫什么時候
- 然后,您將獲得三個與此表達式匹配的電話
參數捕獲示例為:
- 叫什么時候
- 然后您會接到三個電話– 記住他們
- 當您檢查這些調用的值時
- 然后他們匹配這些斷言
注意:后面的測試在參數捕獲時口吃。 接下來的步驟需要檢查提取的參數, 然后再進行一些提取操作。 因此,它是一種用于特定目的的工具,其中將斷言嵌入argThat或內置的匹配器之一不夠強大,或者沒有提供有意義的測試失敗輸出。
翻譯自: https://www.javacodegeeks.com/2020/04/mockito-matchers-precedence.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Mockito匹配器优先的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate字节码增强
- 下一篇: 小米Redmi秋季新品发布会价格汇总:最