2012-02-23 227 views
0

嗨我是新編寫JUnit測試用例。任何人都可以用這種方法幫助我嗎?Junit測試用例

private boolean validateDate(Date date, String datesInCsv) { 
     boolean dateAlreadyExist= false; 
     final String[] dateVal = datesInCsv.split(","); 
     List<Date> allDates = new ArrayList<Date>(); 


     for (final String stringDate : dateVal) { 
      allDates .add(DateUtil.parseDate(stringDate ,"MM/dd/yyyy")); 
     } 
     if (allDates .contains(date)) { 
      dateAlreadyExist= true; 
     } 
     return dateAlreadyExist; 
    } 

如何在寫這些類型的方法的測試用例之前開始以及應該記住什麼?

回答

0

通常你不直接測試私有方法,但是你可以通過測試調用它的方法來獲得測試覆蓋率。沒有什麼說你不能測試它。

您將需要使用反射(或Groovy)來測試它,因爲它是私有的。對於要測試的內容,您需要測試null和其他意外的輸入值以及任何邊界條件(真正的大日期,非常小的等等)。另外在你的情況下,你可能想檢查意外的日期格式。

Junit網站(和junit谷歌或Stackoverflow搜索)可以爲您提供更多關於單元測試的想法。

希望這會有所幫助。

1

測試純粹主義者會回答「如何開始」,說的是開始測試,而不是實施。但是,當你有自己的方法時,你已經超過了這一點。

和cjstheno是正確的,測試私有方法是,這個,很奇怪。

所以我通常與測試開始圍繞無效輸入

@Test(expected = IllegalArgumentException.class) 
public void nullDateIsBadInput() { 
    yourclass.validateDate(null, "01/01/2000"); 
} 

然後我測試方法

@Test 
public void janFirstIsInInput() { 
    Assert.assertTrue("janFirst is in inuputs", 
     yourclass.validateDate(janFirst, "01/01/2000, 01/02/2000"); 
} 

@Test 
public void janFirstIsNotInInput() { 
    Assert.assertFalse("janFirst is not in inputs", 
     yourclass.validateDate(janFirst, "04/01/2000, 01/02/2000"); 
} 

不要忘了把可選的消息到assert調用的主旨,當你回到代碼時,它會讓你更容易。

最後,在測試工作完成後,不要忘記重構代碼(以及測試!)返回值allDates .contains(date)而不是將其存儲在冗餘變量中。

+0

這是一個非常好的答案(儘管assertTrue和assertFalse拼寫錯誤),並且我只是+1了。有一點我不同意 - 「不要忘記將可選消息放入聲明中」。對於這種風格的測試,每種測試方法都有一個斷言,我認爲這不合理;實際上它違反了DRY。 JUnit報告失敗方法的名稱 - 在這些示例中,方法的名稱與斷言中的消息完全相同。我寧願不要使用可選消息;如果你的測試中有很多斷言,現在是時候把它分解成更小的測試。 – 2012-02-26 08:31:47

0

從@Paul開始,不要忘記在迭代周圍測試邊界。由於datesInCsv可以是多個日期,因此請測試空字符串,表示單個日期的字符串以及表示多個日期的字符串。

然後,您可以對可疑輸入進行預測,然後回到您的要求。這包括諸如開始,結束或字符串中的日期之間的空格。尾隨逗號怎麼樣?這些類型的可疑事物作爲測試非常重要,因爲它們可以作爲未來開發人員的需求文檔的一種形式,這些開發人員可能會遲來,希望「優化」事情。請記住,測試的目標不僅僅是確保今天的事情正在發揮作用,而且還要以可執行形式保存這些期望,以確保明天它們也是真實的。