2016-05-13 121 views
0

我是單元測試新手,我的經理推薦Mockito。我正在探索這個工具,但是有像有些混亂:爲什麼我們需要創建模擬對象?

  1. 爲什麼我們需要創建模擬對象,而我們可以創建任何類的實物。

  2. 爲什麼我們在開發人員設置方法的行爲時,使用stubbing(如'when and then')條件設置任何方法的行爲。

  3. 如果我們做任何方法的存根,那麼它將是靜態的,如果開發者改變了那個方法的代碼,那麼它的影響就不會出現在我們的測試用例中,它總是會通過。

例如:

TestingServices test = Mockito.mock(TestingServices.class); 

    // define return value for method getUniqueId() 

    System.out.println("unique id is "+test.getUniqueId()); 

    when(test.getUniqueId()).thenReturn(44); 

    assertEquals(test.getUniqueId(),44); 

在上面的代碼片斷assertEquals將總是通過,顯影劑是否改變的代碼或沒有。

+1

您的測試是一個壞榜樣,因爲它是單元測試它的嘲諷同樣的事情。在一個真實的例子中,你可以通過嘲笑B來單元測試A,以便隔離A的行爲,反之亦然。然後你會有更高層次的集成測試,檢查A和B在兩者都不被模擬時仍然正確交互。 – jonrsharpe

+0

嗨Jonrsharpe,謝謝你給我回答。其實我的擔憂是爲什麼我們需要瘋狂的模擬物體和殘肢?請解釋一下,你的幫助會清除我的疑惑。 –

+0

嗨Exoddus,你可以給我更多的例子,當我們創建模擬對象或當不需要創建它。 –

回答

0

首先是照顧你在任何情況下測試什麼。

在你的代碼片段中,似乎你正在測試類TestingServices,你不應該嘲笑這個類,因爲它的行爲是你正在測試的,而不是Mockito如何工作注入你的'假'方法響應。 實際上,在你的例子中,你正在測試Mockito注入你想要的行爲,並按預期工作,僅此而已。

例如:您的TestingServices類內部有一個對象,它使用第三方API並獲得響應(或MVC體系結構中的Controller使用的DAO對象)。如果你正在測試你的TestingServices或你的Controller,你不想失敗,因爲依賴,你可以嘲笑系統的這一部分。

模擬讓你專注於被測試的類而不是你正在測試的過程中需要的上下文或其他類,並且抽象出其餘的組件。

有很多談論這個問題:

+0

所以當我們需要創建模擬對象時,請給我一些例子。 –

+1

Mohd,我正在用您提供的代碼回答您的問題。如果需要關於嘲笑的具體示例,那麼肯定會發現很多搜索'java模擬示例'的示例肯定:) – exoddus

相關問題