2010-04-23 39 views
36

我們在內存中使用hdsqldb來運行鍼對數據庫運行的junit測試。數據庫在通過彈簧配置運行每個測試之前設置。一切正常。 現在,當測試失敗時,能夠檢查內存數據庫中的值可能很方便。這可能嗎?如果是這樣如何? 我們的網址是:調試時在內存中檢查hsqldb

jdbc.url =的jdbc:HSQLDB:MEM:TESTDB; sql.enforce_strict_size =真

數據庫是每個測試後銷燬。但是當調試器運行時,數據庫應該仍然活着。我試過用sqldb databaseManager連接。這有效,但我沒有看到任何表格或數據。任何幫助,高度讚賞!

回答

16

HSQL在內存中,所以當你說你與SQLDB數據庫管理器連接,你沒有 - 你是不是連接到在SQLDB數據庫管理器的內存空間,而不是一個在另一個數據庫單元測試的內存空間。這就是SQLDB數據庫管理器中的數據庫爲空的原因。

您可以運行HSQL作爲使用org.hsqldb.Server描述here服務器。

儘管org.hsqldb.Server類通常用於啓動單獨進程,但您可以在單元測試中實例化並配置它,這應該允許遠程進程連接和查詢數據庫。

或者,您必須編寫某種轉儲功能,並根據需要從您的單元測試中調用。另外,在單元測試中使用HSQL只是證明你的代碼對HSQL不起作用,這與實際的數據庫是不同的。這意味着你可以得到誤報,反之亦然。使用模擬API或更好的方法可以達到同樣的效果,可以節省數據庫測試,以便在與真實數據庫一起使用的一些體面的集成測試中進行測試。

+1

感謝您的迴應!我已經想通了,它有效,如果你有hsqldb寫入文件並使用該URL來連接它。我正在使用一個老式的驅動程序,這是我的方式。 我同意你也應該對真實的數據庫進行測試,我們也是這樣做的,但讓sql驗證被驗證是更有價值的,然後嘲笑它我會說。 – Albert 2010-04-23 11:28:19

66

在單元測試或@Before/setUp()方法,你可以添加以下行啓動HSQL數據庫管理器:


org.hsqldb.util.DatabaseManager.main(new String[] { 
    "--url", "jdbc:hsqldb:mem:testdb", "--noexit" 
}); 

或改進的Swing版本


org.hsqldb.util.DatabaseManagerSwing.main(new String[] { 
    "--url", "jdbc:hsqldb:mem:testdb", "--noexit" 
}); 

的數據庫管理器允許您檢查模式,並在應用程序運行時在實時內存數據庫上運行SQL查詢。

如果要檢查特定行的數據庫狀態,請確保設置一個關口或暫停執行。

+0

請注意,我省略了JDBC URL中的「sql.enforce_strict_size = true」部分,我不確定這裏會產生什麼效果...... – dimdm 2010-07-26 15:07:33

+4

當我按照您的建議操作時,DatabaseManager啓動但凍結。我無法做任何事情。如果我強制退出它,調試會話也會死掉。我正在使用Intellij Idea 11.1.2。 – 2012-07-11 14:57:36

+2

請參閱此處(http://stackoverflow.com/questions/11435654/connect-to-in-memory-hsql-hypersonic-database-with-databasemanager-while-debug/11437102#11437102)討論如何保持DatabaseManager從凍結。 – 2012-07-11 16:25:46

13

運行單元測試的斷點,然後在Eclipse的Debug透視圖,打開顯示視圖(窗口,顯示視圖,顯示),然後輸入

org.hsqldb.util.DatabaseManagerSwing.main(new String[] { 
    "--url", "jdbc:hsqldb:mem:testdb", "--noexit" 
}); 

(按dimdm的帖子),高亮,右鍵單擊並選擇執行。

+0

正如@dimdms的帖子一樣執行SQL時,HSQL數據庫管理器凍結。 – yellavon 2013-10-17 15:32:21

+1

@yellavon在您的IDE斷點上配置爲不凍結所有線程 – deFreitas 2016-06-09 18:00:30

0

您還可以使用[HSQLDB] [1]中包含的DatabaseManagerSwing類傳遞給它一個打開的連接,它允許您查看連接所在事務中的數據庫狀態。

DatabaseManagerSwing manager = new DatabaseManagerSwing(); 
manager.main(); 
manager.connect(connection); 
manager.start();