2013-02-25 129 views
1

我在Test類中創建了以下四個測試,測試CompanyService的findCompany()方法。單元測試和集成測試示例

@Test 
public void findCompany_CompanyIdIsZero() { 
    exception.expect(IllegalArgumentException.class); 
    companyService.findCompany(0); 
} 
@Test 
public void findCompany_CompanyIdIsNegative() { 
    exception.expect(IllegalArgumentException.class); 
    companyService.findCompany(-100); 
} 
@Test 
public void findCompany_CompanyIdDoesntExistInDatabase() { 
    Company storedCompany = companyService.findCompany(100000); 
    assertNull(storedCompany1); 
} 

@Test 
public void findCompany_CompanyIdExistsInDatabase() { 
    Company company = new Company("FAL", "Falahaar"); 

    companyService.addCompany(company); 

    Company storedCompany1 = companyService.findCompany(company.getId()); 
    assertNotNull(storedCompany1); 
} 

我的理解是,前三個是單元測試。他們測試findCompany()方法的行爲,檢查方法如何響應不同的輸入。 第四個測試,雖然放在同一個班,但實際上似乎對我來說是一個綜合測試。它要求首先將公司添加到數據庫中,以便稍後可以找到它。這引入了外部依賴項 - addCompany()和數據庫。

我正確嗎?如果是,那麼我應該如何進行單元測試以查找現有對象?只是嘲笑服務「找」一個?我認爲這會殺死測試的意圖。

我很欣賞這裏的任何指導。

回答

1

我這樣看:你在這裏測試的「單位」是CompanyService。從這個意義上說,你所有的測試看起來都像是單元測試。然而,在你的服務之下,可能有另一項服務(你提到一個數據庫),這個測試也在進行中?這可能會開始模糊集成測試的一些線條,但是您必須問自己是否重要。您可能存根任何這樣的底層服務,你可能想,如果:

  1. 基礎服務是緩慢的設置或使用,使您的單元測試太慢。
  2. 您希望確保此測試的行爲不受底層服務的影響 - 即只有在CompanyService中存在錯誤時,此測試纔會失敗。

根據我的經驗,如果底層服務足夠快,我不必過多擔心依賴它的單元測試。我不介意在我的單元測試中出現一些集成漏洞,因爲它具有益處(更多的集成覆蓋率)並且很少導致問題。如果確實會造成問題,您可以隨時回來並添加殘片以改善隔離效果。

+0

嘛。底層服務(數據庫調用)僅僅是Hibernate單線調用,肯定不會包含任何錯誤。所以,我猜我在做什麼是沒問題的。 – 2013-02-28 06:55:01

1

[1,2,3,4]可能是基於單位(嘲弄|不嘲弄)和基於集成的測試。這取決於你想測試什麼。

  • 爲什麼要使用嘲諷?由於Jason Sankey說... 只測試服務層不下層
  • 爲什麼要使用嘲諷?您的業​​務邏輯可以有有多種形式。所以你可以寫幾個測試一個服務方法,例如。創建人員(沒有地址 - 例外,沒有銀行賬戶 - 例外,人員沒有填寫非空屬性 - 例外)。

你能想象,爲了測試所有可能性異常狀態(沒有地址,沒有銀行賬戶等),每個測試請求的數據庫?爲了測試所有異常狀態,填充數據庫的工作量過大。爲什麼不使用模擬對象,例如。就像不包含期望值的「殘缺」對象一樣。每個測試構造都擁有'殘缺'模擬對象。

嘲笑各種狀態===您的測試將盡可能簡單,因爲每個測試方法將只測試一個狀態。這些測試將會很清晰,易於理解和維護。如果我編寫測試,這是我想達到的目標之一。