2014-05-09 69 views
0

我需要爲我當前的項目學習Mockito,並且正在努力掙扎。我可能會補充一點,我從來沒有在單元測試中學過任何東西(對於那個母語,在java中很少,哈哈),所以我似乎必須一次學習多件事情。我花了一段時間在Mockito上查看一些資源,但仍可以使用一些幫助。下面我創建了一個小例子,我希望有人能夠爲我在Mockito中創建一個JUNIT。Mockito-需要幫助從示例中學習

public class Animal{ 

    public numberOfTeeth(AnimalType animal){ 
      if animalAlive(){ 
       Teeth tooth= animal.getNumberOfTeeth(); 
       if(tooth== null) {  
        throw new ValidationException("Invalid Tooth");   
       } 
      } 
    } 

請原諒語法錯誤,這是一個快速構建的學習示例。

因此,讓我們說animalAlive()是動物類中的私有方法,getNumberOfTeeth()是其他類中的公有方法。我假設一個junit測試可能會測試是否應該拋出異常?最好的辦法是什麼?

我會假設它涉及嘲笑AnimalType和創建存根(?)來控制numberOfTeeth方法內的兩個方法調用? Animal類中的私人方法是否會在任何事情中引發一場扳機?

+0

我與你分享我對JUnit和教程的Mockito http://eddumelendez.github.io/blog/2014/03/23/junit-and-mockito/ –

回答

2

爲了在測試這種方法時能夠完全徹底,我想說你想要測試用例以滿足以下三種情況。

  • 當動物是活的,齒數爲null,則拋出異常,
  • 也不例外,當動物是活的,牙齒的數量不爲空,
  • 也不例外,當動物已經死了。

所以你需要以下內容。

  • 一個Animal目的是測試,
  • 一個嘲笑AnimalType
  • 有效Tooth對象,其可以是或可以不是一個模擬,
  • 一個JUnit ExpectedException規則 - 有測試的其它方式拋出異常,但這是最通用的,所以我建議學習現在使用它,並在涉及異常的所有測試中使用它,即使它看起來過度。

在您的AnimalTest類中,您將有三種測試方法,一種用於您要測試的每種場景。

numberOfTeethFailsForLiveAnimalWithInvalidTeeth

  1. 使用例外規則,以 「期待」 一ValidationException
  2. 致電numberOfTeeth對活的動物,與您的模擬AnimalType。既然你沒有存儲過getNumberOfTeeth(),它將返回null,所以應拋出異常。

numberOfTeethSucceedsForLiveAnimalWithValidTeeth

  1. 存根你的模擬AnimalType返回從getNumberOfTeeth()有效Tooth
  2. 致電numberOfTeeth對活的動物,與您的模擬AnimalType

無需驗證任何內容 - 此方法完成的事實意味着不引發異常。

numberOfTeethSucceedsForDeadAnimal

  1. 呼叫任何你需要打電話,讓你的動物 「不是活的」。
  2. 致電numberOfTeeth對活的動物,與您的模擬AnimalType

再一次,沒有必要驗證任何事情 - 這個方法完成的事實意味着不拋出異常。

您可以通過一些小的事情來改善您的代碼。

  • 不要叫你的AnimalType參數animal,當你有一個叫Animal型 - 它只是太混亂。
  • getNumberOfTeeth()方法使用不同的名稱 - 它不返回數字,它返回Tooth,所以這個名稱也是令人困惑的。
  • 對您的錯誤消息使用常數。這樣,在使用異常規則的測試方法中,您可以驗證錯誤的文本是否正確,但在執行此操作時實際使用常量。不復制文本可降低在應用程序類中更改消息的風險,但不會在測試類中更改。
+0

謝謝你,這是一個非常深思熟慮答案,這對我有很大的幫助。我很感激! – TheJavaBeast