2013-07-12 54 views
0

我使用Hibernate和廣泛採用的Hibernate查詢語言來定義我的DAO中的查詢。使用Hibernate集成測試本機SQL查詢

無論如何,有時HQL無法執行與本機SQL查詢相比的特定任務。

例如下面的Postgres的表情不是「轉換」到HQL:

my_date > current_date - interval '10 year' 

這意味着,在某些情況下,我正在寫原生查詢。考慮到我正在使用另一個數據庫進行集成測試(http://hsqldb.org/),它不反映上述Postgres表達式的語法。這導致在使用這種本地查詢的DAO方法期間出現測試異常。

你如何處理這種情況?我只是覺得以下情況:

  • 不要使用本地查詢,並嘗試在HQL構建一切
  • ,不測試它們使用這種查詢方法(不高興)
  • (可能嗎?)
  • 使用同一個數據庫既爲生產和發展(性能問題)

其他更有趣的解決方案?謝謝

+0

您正在使用另一個數據庫_unit testing_?我認爲你誤解了單元測試的目的。你根本不應該打數據庫。當您開始訪問數據庫時,您現在正在使用_integration testing_。單元測試的目的是覆蓋一個特定的* unit *代碼(通常是一個類),並且應該模擬該類可能具有的任何和所有外部依賴。 –

+0

@ColinMorelli所以你如何在單元測試中測試DAO?你如何*嘲笑*數據庫? –

+0

也許一個解決方案是擴展一些hibernate/jpa類(例如EntityManager)以在將SQL發送到HSQLDB之前更改SQL。 – mael

回答

2

通常情況下,集成測試的目的是測試與生產環境非常相似,因此IMO應該使用相同的數據庫引擎。但對於單元測試,使用HSQLDB沒有問題。在這種情況下,不幸的是,依賴於Postgres的類不能被單元測試,你必須等到集成測試才能檢測到錯誤。

然而,在附註中,您提到的Postgres SQL的結果可以通過在Java上執行日期算法來實現。

Calendar currentDateCal = Calendar.getInstance(); 
currentDateCal.add(Calendar.YEAR, -10); 
Date currentDate = currentDateCal.getTime(); // bind this currentDate object into your HQL parameter 
+0

在單元測試中,您不應該與數據庫交談,它應該測試代碼的特定部分_,而無需外部依賴。 –

+0

感謝gerry,儘管很多人完全反對使用不同的數據庫進行「無論」測試,我認爲你是對的,如果我依賴於數據庫語法,我可以使用相同的數據庫或適應查詢。 – Wizche