2012-11-03 96 views
2

簡單的問題。如果我使用spring-data爲我的DAO層生成CRUD方法,是否還應該針對生成的方法編寫單元測試?或者這將是單元測試庫代碼的等價物?我應該單元測試生成的Java代碼嗎?

在此先感謝。

編輯:爲了說明問題,我在詢問是否需要編寫單元測試以及一套在發佈之前運行的集成測試。例如,unit test爲DAO層的findAll()方法將類似於以下內容:

class DepartmentDAOTest extends spock.lang.Specification { 
    /* ... */ 
    def "returns all departments"() { 
     setup: 
     def result = new List<Department>() 
     when: 
     result = dao.findAll() 
     then: 
     result.size() == EXPECTED_SIZE 
    } 
} 

鑑於一個integration test可能會通過用手測試團隊或顯影劑進行運行,可能標記新的前發佈。這可以使用JWebUnitGeb自動化,並且測試每個組件(包括平臺)以確保它們在「集成」時按預期工作。

如果我使用JdbcTemplate手動編寫DAO實現,那麼我應該不會單元測試每種方法。當我單元測試服務層(調用DAO層)時,我可以嘲笑DAO層,所以我不測試兩次。

如果我爲生成PDF格式的第三方庫(如pdfbox)進行調用,每種方法都有工作的期望(因爲它是作爲pdfbox項目的一部分進行測試的)。我不測試他們的drawSquare方法真的繪製了一個正方形,但在集成測試期間,我會看到我的導出PDF功能按照我們希望的方式正確地導出PDF。

所以這個問題應該重新措詞爲:「在哪個測試階段測試我的春季數據使用情況?」

+2

你絕對應該測試生成的代碼_somehow._ –

+0

我的猜測是它應該在集成測試期間完成。 – Joe

回答

4

首先,根本沒有生成代碼。我們從您聲明的查詢方法構建了一個查詢元模型,並動態執行這些查詢。這裏的簡短答案是:你絕對應該測試這些聲明的方法。原因很明顯,因爲它很簡單:查詢方法聲明 - 無論它們使用派生查詢還是手動聲明 - 都與您爲實體定義的映射元數據進行交互。因此,檢查查詢方法執行以確保您能夠看到預期的結果是絕對合理的。這當然是對執行的查詢進行更多的集成測試和語義檢查,而不是傳統的單元測試。

+0

感謝Oliver。你會如何推薦這樣做?我應該避免在服務單元測試中嘲笑DAO嗎? – Joe

4

否。作爲一般規則,請不要測試平臺。

+1

我不認爲有任何諷刺。 – jahroy

+0

@ Woot4Moo這個答案是從字面上理解的。不知道你爲什麼不確定這一點。 – EJP

+0

您不需要測試Spring Data實現,但需要測試「Generator」(方法名稱或自定義查詢)的「配置」。 - 和JPA一樣:你不需要測試Hibernate/Eclipslink生成的SQL查詢,但是你需要測試你的JPQL查詢是否正確! - 最後,你的答案不符合問題! – Ralph

相關問題