簡體   English   中英

Mockito,方法驗證的任務

[英]Mockito, mission of method verify

您能否解釋一下模擬方法驗證的任務? 文檔說,此方法檢查是否調用了該方法。 但是,當它真正有用時,您可以舉一個例子嗎? 通常在測試方法中,我們先調用一個方法,然后...檢查是否已經立即調用了它? 聽起來怪怪的。

它是這樣的:

public class UnderTest {
  private Foo foo;

  public UnderTest(Foo foo) { this.foo = foo };

  public void bar() { foo.foo(); }
}

現在,假設你提供嘲笑富實例UnderTest。 並且您想確保在調用bar()時調用了foo.foo()

然后,使用verify()來確保進行了預期的調用。

換句話說:測試需要驗證方法的行為。 理想情況下,它們通過聲明被測方法返回的值來做到這一點。 但是,並非所有方法都返回某些東西。 然后,您可以通過至少檢查是否確實對擁有/傳遞給被測類的對象進行了某些預期的調用驗證代碼。 然后,您需要verify()

通常執行這種類型的檢查只是為了確保使用指定的參數來使用特定的對象。 假設您正在測試執行某些操作的業務服務,並且在此過程中還將某種審計跟蹤存儲在數據庫中。

將這種信息存儲在數據庫中已經在其他地方進行了測試(使用了單獨的單元測試或某種外部庫),因此您無需檢查審計數據是否正確存儲。 為了您的測試用例,調用此方法的信息就足夠了。 這就是“驗證”方法的用例。

通常在測試方法中,我們先調用一個方法,然后...檢查是否已經立即調用了它? 聽起來怪怪的。

您不驗證您是否調用了測試方法。 您驗證由於該測試所做的任何結果,都調用了某些依賴項(已由模擬替換)。

因此,例如,在測試密碼檢查器方法時,您想斷言,除了拒絕不正確的密碼之外,它還調用某些審核后端系統來注冊失敗的登錄嘗試。 模擬對象將代表該后端系統,您可以使用它來驗證它是否最終被調用(並帶有適當的參數)。

為了簡化...假設您正在使用某些參數測試方法A。 方法A所做的就是調用方法BCD。

使用Mockito.verify,您可以測試方法B,C,D是否真正被調用。 它甚至讓您指定更復雜的測試,例如:

  • 至少(1)
  • atMost(10)

當您要測試的方法根據調用它的參數而表現不同時,它確實很有用。

假設您有一些DAO類,它通過純JDBC與數據庫交互。 您有一些方法可以在數據庫中寫入數據並要對其進行單元測試。 為此,您可能要模擬Connection類。 當您在數據庫中編寫代碼時,您可能會在此模擬上調用commit方法,但是其返回類型為void ,因此您不能保證在測試期間會調用該方法。 要解決此類問題,您可以使用verify 希望能幫助到你!

方法返回的東西或void
在單元測試中,當一種方法返回某些東西時,通常您希望使用特定的值來模擬其結果,並檢查被測試方法的流程是否按預期進行。
好像要模擬的方法返回一些東西是有道理的,通常您需要它的結果:在測試方法的下一個語句中或在測試方法返回的結果中。

由於方法不返回任何內容( void ),因此情況有所不同:您無法模擬其結果。
但是您可以斷言此方法已調用並且具有預期參數。

例如,假設使用PrinterService類來打印文檔

public class PrintService{
 ...
  public void printMessage(String message){
    os.print(message);
  }
}

並且假設您需要在另一個類的單元測試期間將其隔離。
這里測試方法:

public class PrintClient{
 ...
  PrintService printService;

  public void print(String message, PrinterParameters printerParameters...){
     ... // do some tasks
     ...
     printService.print(message);
    ...          
  }
}

PrintService.print()返回任何內容。
因此,在PrintClient的單元測試中,您不想模擬PrintService.print()的結果,因為它沒有。
您只想檢查是否已通過傳遞給PrintClient測試方法的message參數調用了它。

@RunWith(MockitoJUnitRunner.class) 
public class PrintClientTest{

    @Mock 
    PrintService printServiceMock;
    ...
    @Test
    pubic void print(){
      ... 
      String message = "my message";  
      PrintClient printClient = new PrintClient(printServiceMock);
      printClient.print(message, ...);
      //
      Mockito.verify(printServiceMock).print(message);
      ...
    }
}

暫無
暫無

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

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