2010-04-23 59 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();