2017-08-25 188 views
1

您能否介紹一下mockito方法驗證的任務?文檔說,這個方法檢查方法是否被調用。但是,如果它真的有用,你能舉個例子嗎?通常在測試方法中,我們調用一個方法,然後檢查,我們現在調用它了嗎?聽起來怪怪的。Mockito,方法驗證任務

+0

只是爲了記錄:有時候新手會忘記接受答案。所以 - 考慮在某個時候接受其中一個答案;-) – GhostCat

+0

我不會忘記......我不知道正確的答案)))所以,我不能在將來desinform某人 –

+0

你消化輸入,然後你考慮哪些讓你理解了這個問題。你有很好的投入,不應該從那裏挑選一些東西。 – GhostCat

回答

1

爲了簡化...假設您正在測試方法A與某些參數。什麼方法A做的是調用方法B,CD

With Mockito.verify您可以測試方法B,C,D真的被調用。這甚至讓你可以指定更復雜的測試,如:

  • ATLEAST(1)
  • atMost(10)

方法時您正在測試的行爲真的可以有用根據您調用的參數有所不同。

+0

我沒有正確理解你, 我有方法: public void method1(){ method2(); () } public void method2方法1(); verify(mResource).method2(); - 我得到綠色測試線?但我有紅色。它說我: 通緝但未調用: mResource.method2(); 我在做什麼錯誤的方式? –

2

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

在數據庫中存儲這種信息已經在其他地方(單獨的單元測試或某種外部庫被使用)測試過,因此您不需要檢查審計數據是否正確存儲。爲了你的測試用例,這個方法被調用的信息就足夠了。這就是'驗證'方法的用例。

2

通常在測試方法中,我們調用一個方法,然後...檢查,我們現在調用它了嗎?聽起來怪怪的。

您不驗證您是否調用了測試方法。你驗證了無論測試結果如何,都調用了一些依賴項(你已經用模擬代替了)。

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

3

它是這樣的:

public class UnderTest { 
    private Foo foo; 

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

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

現在假設您提供嘲笑 foo的實例UnderTest。並且你想要當然foo.foo()被調用bar()被調用時。

然後您使用verify()確保發生預期呼叫。

換句話說:測試需要驗證方法的行爲。理想情況下,他們通過對由測試方法返回的值聲明做到這一點。但並非所有的方法都會返回一些東然後你可能驗證你的代碼至少檢查某些期望的調用所擁有/傳遞給被測試的類的對象確實發生過。然後你需要verify()

0

讓我們假設你有一些DAO類,它通過普通的JDBC與數據庫交互。您有一些方法可以在數據庫中寫入數據,並希望對其進行單元測試。要這樣做,你可能會模仿Connection類。在寫入數據庫時​​,您可能會在此模擬上調用commit方法,但返回類型爲void,因此您無法保證在測試期間調用該方法。要解決這些問題,您可以使用verify。 希望它有幫助!

+0

是否表示驗證檢查成功\t 完成方法? –

+0

@MariaKarpikova,它只是檢查該方法被調用。 –

0

方法返回東西或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()的結果,因爲它沒有。
您只需檢查是否使用傳遞給 的message參數調用PrintClient經過測試的方法。

@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); 
     ... 
    } 
} 
+0

@Thilo真的很抱歉,但我不確定你的意思。我不想在模擬對象上調用方法,因爲我只想驗證服務是通過我單元測試的客戶端提供的良好參數調用的。 – davidxxx

+0

啊,我的壞,抱歉,在那裏失蹤@InjectMocks感到困惑。 –

+1

@Florian Schaetz不,這是我。我認爲我可能不好選擇了命名。 'PrintClient.print()'和'PrintService.print()'可能會讓人困惑。我添加了一個明確的構造函數來更清晰。 – davidxxx