簡體   English   中英

Mockito,驗證幾個方法調用之一

[英]Mockito, Verify one of the method call among several

我正在用 mockito 編寫一個 Junit 測試,我想驗證一個方法調用是否已進行。 問題是使用不同的參數進行了多個方法調用,我只想驗證其中一個。

Eg : Below are 3 method calls from my code
Metrics.emit(PhoneFailCount,0);
Metrics.emit(PaymentFailCount,1);
Metrics.emit(AddresseFailCount,1);

我該如何驗證

Metrics.emit(PaymentFailCount,1)至少被調用一次。

如果我直接執行verify(Metrics).emit(PaymentFailCount, 1)它會拋出錯誤,說 Argument(s) 不同! 因為它試圖與 Metrics.emit(PhoneFailCount,0) 匹配

我嘗試使用 ArgumentCaptor,但無法同時捕獲兩個參數

謝謝

您可以為此使用ArgumentCaptor。 在下面選擇此代碼。 這應該工作

ArgumentCaptor<String> captor1 = ArgumentCaptor.forClass(String.class);

ArgumentCaptor<Integer> captor2 = ArgumentCaptor.forClass(Integer.class);

verify(Metrics, times(3)).emit(captor1.capture(), captor2.capture);

List<Integer> values = captor2.getAllValues;
//assertIf values have values 0,1 and 1

使用如下代碼:

Metrics metrics = mock(Metrics.class);

// run code that uses metrics

verify(metrics, times(3)).emit(any(), anyInt());
verify(metrics).emit(PaymentFailCount, 1);

所有靜態導入都來自org.mockito.Mockito.*

注意:這種方式不會保留調用順序,這意味着,如果您對emit調用進行重新排序,則測試仍將通過。

除了參數捕獲器Mockito.verify() ,還可以在Mockito.verify()使用hamcrest匹配器,但是在驗證時必須設置要匹配的規則:

verify(Metrics, times(1)).emit(eq(PaymentFailCount),eq(1));

這是一個舊線程,但僅用於記錄:使用當前的 mockito 版本,您可以這樣寫:

verify(Metrics, atLeastOnce()).emit(PaymentFailCount, 1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM