在调试时检查内存hsqldb

时间:2010-04-23 09:03:39

标签: java unit-testing hsqldb

我们在内存中使用hdsqldb来运行针对数据库运行的junit测试。在通过弹簧配置运行每个测试之前设置db。一切正常。 现在,当测试失败时,可以方便地检查内存数据库中的值。这可能吗?如果是这样的话? 我们的网址是:

  

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

每次测试后都会销毁数据库。但是当调试器运行时,数据库也应该仍然存在。我尝试连接sqldb databaseManager。这工作,但我没有看到任何表或数据。任何帮助都非常感谢!

8 个答案:

答案 0 :(得分:67)

在您的单元测试或@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查询。

如果要检查特定行的数据库状态,请确保设置一个beakpoint或以某种方式暂停执行。

答案 1 :(得分:17)

HSQL在内存中,所以当你说你正在连接SQLDB数据库管理器时,你不是 - 而是连接到SQLDB数据库管理器的内存空间中的另一个数据库,而不是内存中的数据库单元测试的空间。这就是SQLDB数据库管理器中的数据库为空的原因。

here所述,您可以使用org.hsqldb.Server将HSQL作为服务器运行。

虽然org.hsqldb.Server类通常用于启动单独的进程,但您可以在单元测试中对其进行实例化和配置,这应该允许远程进程连接和查询数据库。

或者,您必须编写某种类型的转储功能,可以根据需要在单元测试中调用。

顺便说一句,在单元测试中使用HSQL只是证明你的代码适用于HSQL,这与实际数据库不同。这意味着你可以得到误报,反之亦然。使用模拟API或更好的API可以实现同样的目的,保存数据库测试以进行与真实数据库一起使用的一些体面的集成测试。

答案 2 :(得分:15)

将单元测试运行到断点,然后在Eclipse的Debug透视图中,打开Display视图(Window,Show View,Display)并输入

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

(根据dimdm的帖子),突出显示它,右键单击并选择执行。

enter image description here

答案 3 :(得分:0)

您还可以使用[HSQLDB] [1]中包含的DatabaseManagerSwing类向其传递一个开放连接,该连接允许您查看连接所在事务中数据库的状态。

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

答案 4 :(得分:0)

只有在未更改数据库名称,用户名和密码(testdb,SA,空密码)的情况下,上面接受的答案才可以正常使用。

对于自定义数据库名称,用户名和密码,您将收到以下异常

java.sql.SQLInvalidAuthroizationSpecException:无效的授权规范-未找到:SA

然后,您必须手动连接。

要直接连接,请使用以下代码段

org.hsqldb.util.DatabaseManager.main(new String[] {
  "--url",  "jdbc:hsqldb:mem:yourdbname", "--noexit",
  "--user", "dbusername", "--password", "dbpassword"
});

或针对改进的Swing版本

org.hsqldb.util.DatabaseManagerSwing.main(new String[] {
  "--url",  "jdbc:hsqldb:mem:yourdbname", "--noexit",
  "--user", "dbusername", "--password", "dbpassword"
});

在执行以上代码段之前,请先更新以下内容

  • 您的数据库名称-用真实的数据库名称更新您的数据库名称
  • dbusername-用您的数据库用户名更新dbusername
  • dbpassword-用您的数据库密码更新dbpassword

答案 5 :(得分:0)

可以通过在新线程中启动数据库管理器并休眠运行测试的线程来解决数据库管理器冻结的问题。

将此代码段添加到测试中,您将能够在调试时检查数据库。请记住,将数据库URL更改为您的数据库。

Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            org.hsqldb.util.DatabaseManagerSwing.main(new String[] {
                    "--url",  "jdbc:hsqldb:mem://localhost:9001", "--noexit"
            });
        }
    });

t.start();

try {
    Thread.sleep(10000000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

答案 6 :(得分:0)

如果您知道要随时检查的表,则可以将其当前值输出到控制台。

https://stackoverflow.com/a/31887249/32453

您甚至可以在调试器中进行此调用...

答案 7 :(得分:0)

这对我有用:

DatabaseManager.threadedDBM();
Thread.sleep(Long.MAX_VALUE);

来自https://stackoverflow.com/a/13732467/32453

这只是“非固定式”变体DatabaseManager,并提示您输入JDBC连接字符串。摇摆人没有我不认为的等效方法。