2013-07-04 109 views
0

新來的mockito。我仍然試圖理解這是如何工作的。例如,如果我嘲笑一個類,它會自動模擬該類內的所有類嗎?Mockito - 主類包含很多其他類時嘲笑的深度?

class Bank { 
    Customer cust; 
    cust.deposit(102, CHECK); 
    } 

    class Customer { 
    Account acct; 
    public deposit(int amount, Type t) { 
     return account.getLimits(t); 
    } 
    } 

    class Account { 
    AccTypes types; 
    public getLimits(Type t) { 
     int res = types.getAccountType(t); 
     return res; 
    } 
    } 

    class AccTypes { 
    pulic getACcountTypes(Type t){ 
     return something; 
    } 
    } 
  1. 如果我嘲笑Bank,它會自動嘲笑AccountCustomerAccTypes呢?
  2. 如何測試deposit()方法? (它最終必須在AccTypes達到getAccountTypes) (代碼請與解釋)。

請注意,它是一個非常簡單的(實際上是僞代碼)。所以可能不是一個完美的java代碼。但這只是給你一個想法,我想要實現。

+0

你沒有表現出足夠的代碼。 「code,please」:p – fge

+0

您的「Bank」示例不是有效的Java代碼。 –

+0

我不明白爲什麼。它是一個簡單的代碼,可能不是現實世界。但其簡單到足以想象現實世界的場景。 –

回答

4

一個模擬將只實現與你模擬的類或接口相同的非私有方法。它不會包含任何其他對象的引用,即使你模擬的類有引用。

要單元測試deposit()方法的行爲,您將爲Customer的所有相關性創建一個模擬。唯一的依賴關係Account讓我們嘲笑它:

Account accMock = Mockito.mock(Account.class); 
Mockito.when(accMock.getLimits(Type.SOME_TYPE)).thenReturn(500); 

現在,只要任何調用accMock.getLimits()Type.SOME_TYPE,將返回500。如果它被稱爲與其他任何參數,則返回默認值(0falsenull,取決於返回類型)。 接下來,我們創建的對象進行測試和賬號字段設置爲我們的模擬:

Customer customer = new Customer(); 
customer.setAccount(accMock); 

調用方法進行測試,即deposit()

customer.deposit(100, Type.SOME_TYPE); 

現在驗證方法的行爲。我們期望它與Type.SOME_TYPE,沒有別的要求getLimits()

// verify that getLimits() is invoked for Type.SOME_TYPE 
Mocktio.verify(accMock).getLimits(Type.SOME_TYPE); 
// verify that no other method is called on accMock 
Mockito.verifyNoMoreInteractions(accMock); 
+0

太棒了!正是我想知道的! –

+0

實用工具類如何?如果我需要使用它們,我還需要嘲笑它們嗎? –

+0

這取決於實用程序類的複雜性。有時,嘲笑它們並返回一個不變的,衆所周知的價值會更容易。但是,如果他們測試良好,而且做得不多,你可能會讓他們孤身一人。你可能從來不會嘲笑的是隻包含getter/setter的類,並且沒有更多的邏輯,即只存儲一些值/引用。 – nif

0

我可能會誤解你的問題,但是當你用Mockito模擬銀行並打電話說模擬時,你不再調用Bank類中的執行邏輯,所以Mockito沒有理由模擬出這些依賴類。

如果你想從一個調用返回一個模擬類到Bank,那麼你可以設置你的Bank mock返回你想要的指定調用,否則不需要爲其他類創建模擬。

E.g.

​​
+0

所以我用模擬(Bank.class)爲Bank創建一個模擬。我需要打電話存款。所以我需要模擬客戶,然後才能打電話,甚至在客戶之前,我需要模擬帳戶等?如果問題不明確,請道歉。 –

+1

@KevinRave不,我認爲你很困惑。如果我創建一個銀行模擬,那麼我不再調用在銀行類中實際實現的任何功能,我只是在調用模擬。這個模擬允許我控制對模擬的任何呼叫應返回的內容,以及驗證並看到針對該模擬的某些呼叫。這裏真正的問題是,你爲什麼要創造銀行的模擬,你想做什麼? –

+0

銀行是我的Web服務類,存款是我的Web服務方法。它具有像銀行類(賬戶,客戶等)的依賴性增長 –