2012-08-13 82 views
0

可能重複:
What is Object Mocking and when do I need it?爲什麼要使用框架,而不是創建對象本身創建一個模擬對象

爲什麼要創建使用模擬對象

MyObject myOb = Mockito.mock(MyObject.class); 

時候能只是改用:

MyObject myOb = new MyObject(); 

    public class MyObject(){ 
     private String str; 
     //getters and setters 
    } 

如果上述問題變得更加複雜&它依賴於其他對象,我需要爲這些還創建模擬對象。因此,如果需要將所有成員設置爲測試對象,爲什麼不直接創建對象而不是使用框架來嘲笑它呢?

+1

因爲https://code.google.com/p/mockito/描述的Mockito做什麼 – 2012-08-13 11:18:50

+1

因爲模擬框架提供比普通對象,表現力,存根,驗證,回調等更多的功能。在單元測試中,您現在更關注協作者之間的交互,這意味着您可以進一步測試不同的執行路徑,在不同的場景下,也就是說,它有助於覆蓋你的代碼 – Brice 2012-08-13 12:27:21

回答

4

只是比較你寫在你的例子行數。當然,你可以手動編寫所有的模擬,但是你會做更多的輸入,而且你的測試的可讀性會降低。

+0

另外,考慮你的對象有20多種方法,但你只關心嘲笑他們中的一個*(或其中的一些)。對象:仍然是1行,自己寫:很多行 – 2012-08-13 11:31:44

+0

@BjörnPollex行數I ha已經寫在我的例子中是一樣的 - 每一行 – 2012-08-13 13:26:25

+1

也許我誤解了一些東西。它看起來像你寫'MyObject'類專門用作模擬。假設你需要實現一個用於測試的接口,但是你還沒有一個接口(例如你需要從你正在編寫測試的庫的用戶那裏進行回調)。這是嘲笑可以幫助你的地方。不要只爲測試編寫一個實現,你可以讓一個模擬框架來處理這個。這就是我在答案中的意思。 – 2012-08-13 13:38:34

2

當你嘲笑的東西,你也可以斷言某些事情發生,比如你可以斷言一個方法調用參數等

你不能這樣使用的具體類

+3

你可以用一個具體的類來做到這一點,但你必須手工編寫它的邏輯。嘲笑框架真的只是方便 - 但**很多**。 – 2012-08-13 11:22:02

+0

你可以,但你必須爲每個場景創建一個會議課堂。在我看來,嘲笑一個類更容易,因爲你只需要嘲笑你正在測試的場景,其他方法,屬性等可以忽略 – 2012-08-13 11:24:55

1

如果你做問這個問題,你從未遇到過需要嘲笑的測試場景複合體。當然,如果你的課程簡單且隔離,你可以通過實例化它們來測試它們,你應該。

然而,在許多現實生活中的情況下,你想測試對其他類的依賴關係,其中這是不可能的(或期望)實例他們在一個單元測試場景類。這可能是他們與外部服務或數據庫進行通信。這可能是因爲他們需要實例化一長串額外的依賴關係。

還請記住,單元測試大約是隔離特定的計算單位,並驗證它們的行爲應該是獨立的。嘲笑是這樣做的好方法,允許您從測試中移除依賴關係。用途不同說:「假設依賴A返回Y,驗證此方法返回X(和依賴A被稱爲與這些參數)。