2017-04-06 71 views
1

當有兩個公用方法和一個方法在同一個類中調用另一個公用方法時,測試方法的方法是什麼?如何進行單元測試的情況下,有兩個公共方法,一個調用另一個?

我應該如何在這種情況下編寫單元測試?


一個例子

class SpecificIntMath { 
    public int add(int a,int b) { 
     return a+b; 
    } 
    public int multiply(int a, int b) { 
     int mul = 0; 
     for(int i = 0;i<b,i++) { 
      mul=add(a,mul); 
     } 
     return mul; 
    } 
} 

這個例子沒有顯示的兩個參與的方法,但這個概念的複雜性。

我應該分別測試addmultiply嗎?如果我只測試multiply,我覺得我們錯過了multiple無法提供參數的情況。

假設multiplyadd需要單獨測試,我應該能夠模擬add?這怎麼可能?

假設multiplyadd要單獨測試,我不應該模擬,我應該讓add照原樣運行。如果是這種情況,我應該如何處理add中的程序流程?

什麼是測試這種情況的方法。


編輯1:

在下面的代碼,

class MCVC { 
    public boolean getWhereFrom(List<User> users) { 
     boolean allDone = true; 
     for(User user: users){ 
      String url = user.getUrl(); 
      switch(url) { 
       case Consts.GOOGLE: 
        someDao.updateFromAddr(user); 
        user.setEntry("Search Engine"); 
        break; 
       case Consts.FACEBOOK: 
        someDao.updateFromAddr(user); 
        user.setEntry("Social Media"); 
        break; 
       case Consts.HOME: 
        someDao.updateToAddr(user); 
        user.setEntry("Company"); 
       default 
        user.setEntry(null); 
        allDone = false; 
        break; 
      } 
     } 
     return allDone; 
    } 

    public void likedDeck() { 
     List<Users> usersList = deckDao.getPotentialUsers(345L,HttpStatus.OK); 
     boolean flag = getWhereFrom(usersList); 

     if(flag) { 
      for(User user: usersList) { 
       //some Action 
      } 
     } 
    } 
} 

我應該考慮getWhereFrom()在測試likedDeck()或者我應該承擔任何違約的情況呢?如果我考慮違約情況,那麼在輸出不是違約的情況下,我就會失敗。我不確定我應該嘲笑它,因爲正在調用的課程正在測試中。 Spying/Mocking class under test

+1

只是單獨測試它們。當測試'multiply'時,不要試圖模擬'add',你甚至不知道'multiply'是否會調用'add'(至少在編寫測試時你不應該知道這一點)。 – john16384

+0

另外請注意,當b <0時,你的乘法被破壞 – 2017-04-06 11:36:57

回答

2

你不在乎。

您可以使用單元測試來測試合同自身各公共方法的。因此,你寫測試,確保add()multiply()做他們應該做的。

內部使用另一個的事實在外面沒有興趣。您的測試不應該知道也不關心這個內部實現細節。

只是爲了記錄:因爲你的代碼是現在寫的;你絕對不要在這裏嘲笑。這裏不需要嘲笑;只有增加測試的東西有沒有與您的真實生產代碼有關的風險。您只有只有當您必須控制對象的各個方面以啓用測試時才使用模擬。但是您的示例代碼中沒有任何內容需要嘲笑測試。如果會的話 - 這將是一個糟糕的設計/實施(鑑於這些方法的合同)!

編輯;給出的變化示例中的問題:

首先,有一個錯誤getWhereFrom() - 你迭代一個列表;但是你一直覆蓋該列表中的返回值。所以當第一次迭代將結果設置爲false時,該信息可能在下一個循環中丟失。

我看到的實際問題兩種選擇:

  • 你轉的Mockito;和它的「間諜」概念做部分嘲弄;如果你想保持你的源代碼是
  • 我,親自;我寧願投入時間來改進生產代碼。在我看來作爲getWhereFrom()可能是值得其自己類(在那裏我可能不會擁有它的用戶的名單上工作,但只是一個用戶;也有返回一個布爾值可以幫助;-) 。當你這樣做時,你可以使用依賴注入來獲取該「WhereFromService」類的(模擬)實例。

換句話說:您顯示的代碼可以重新編制/重構;例如更清楚地遵循SRP。但這當然是一項更大的任務;你需要與周圍的人討論。

+0

好吧,如果我分別測試兩個數據,那我該如何處理'multiply'內的數據[在我的情況下,我必須模擬某些'Dao'],其輸出直接影響「add」的內部? –

+0

我用DI來推動模擬。問題在於Dao的輸出是一個列表,而'add''方法有一個'switch-case'和更多的'Dao'影響某些狀態,我必須測試它們的參數。每個模擬都是依賴注入的。 –

+0

清除了錯誤。 –

0

至少測試他們兩個。乘法測試隱式地測試添加是沒有問題的。在大多數情況下,您應該問自己是否有必要公開兩種方法。

0

我應該分別測試加法和乘法嗎?

如果您正在進行單元測試,您應該單獨測試它們。您只想在進行組件或集成測試時一起測試它們。

假設乘法加上單獨測試,我應該能夠 模擬添加嗎?

這怎麼可能?

使用mockito或任何其他嘲諷框架。究竟如何才能看到這裏Use Mockito to mock some methods but not others

假設乘法和加法單獨測試,我不應該 模擬,我應該讓加執行,因爲它是。

我不會這麼做。添加的內部變化可能會影響測試的乘法運算,並且測試會變得更加複雜和不穩定。

相關問題