We're using hdsqldb in memory to run junit tests which operate against a database. The db is setup before running each test via a spring configuration. All works fine. Now when a tests fails it can be convinient to be able to inspect the values in the in memory database. Is this possible? If so how? Our url is:
jdbc.url=jdbc:hsqldb:mem:testdb;sql.enforce_strict_size=true
The database is destroyed after each tests. But when the debugger is running the database should also still be alive. I've tried connecting with the sqldb databaseManager. That works, but I don't see any tables or data. Any help is highly appreciated!
HSQLDB (HyperSQL DataBase) is the leading SQL relational database system written in Java. It offers a small, fast multithreaded and transactional database engine with in-memory and disk-based tables and supports embedded and server modes. It includes a powerful command line SQL tool and simple GUI query tools.
HSQLDB (Hyper SQL Database) is a relational database management system written in Java. It has a JDBC driver and supports a large subset of SQL-92, SQL:2008, SQL:2011, and SQL:2016 standards.
In your unit test or in the @Before
/ setUp()
method, you can add the following line to launch the HSQL Database Manager:
org.hsqldb.util.DatabaseManager.main(new String[] { "--url", "jdbc:hsqldb:mem:testdb", "--noexit" });
or for the improved Swing version with "more refinements" (but about same functionality)
org.hsqldb.util.DatabaseManagerSwing.main(new String[] { "--url", "jdbc:hsqldb:mem:testdb", "--noexit" });
The DB manager lets you inspect your schema and run SQL queries on the live in-memory database while the application is running.
Make sure to set a beakpoint or pause the execution one way or another if you want to check the state of your database at a specific line.
HSQL is in memory, so when you say that you're connecting with SQLDB Database Manager, you're not - you are instead connecting to another database in the memory space of the SQLDB Database Manager, not the one in the memory space of the unit test. This is why the database in the SQLDB Database Manager is empty.
You can run HSQL as a server using org.hsqldb.Server
as described here.
Although the org.hsqldb.Server
class is typically used to start-up a seperate process, you could instantiate and configure it in your unit test, which should allow a remote process to connect and query the database.
Alternatively, you'll have to write some sort of dump functionality that is called from within your unit test as need be.
As an aside, using HSQL in unit tests is just proving your code works against HSQL, which is different to the actual database. This means you can get false positives and vice versa. The same thing can be achieved with a mocking API or better, save the database testing for some decent integration tests that works with the real database.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With