2010-04-23 10 views
36

Estamos utilizando hdsqldb en la memoria para ejecutar pruebas junit que operan en una base de datos. El db se configura antes de ejecutar cada prueba a través de una configuración de resorte. Todo funciona bien Ahora, cuando falla una prueba, puede ser conveniente poder inspeccionar los valores en la base de datos de la memoria. es posible? ¿Si es así, cómo? Nuestra url es:Inspeccionar en la memoria hsqldb durante la depuración

jdbc.url = jdbc: hsqldb: mem: testdb; sql.enforce_strict_size = true

La base de datos se destruye después de cada ensayo. Pero cuando el depurador se está ejecutando, la base de datos también debería estar activa. Intenté conectarme con el administrador de base de datos sqldb. Eso funciona, pero no veo tablas ni datos. ¡Cualquier ayuda es muy apreciada!

Respuesta

16

HSQL está en la memoria, por lo que cuando dice que se está conectando con el Administrador de base de datos SQLDB, no lo está - en su lugar se está conectando a otra base de datos en el espacio de SQLDB Database Manager, no al espacio de memoria de la unidad de prueba. Esta es la razón por la cual la base de datos en el Administrador de base de datos SQLDB está vacía.

Puede ejecutar HSQL como servidor usando org.hsqldb.Server como se describe here.

Aunque la clase org.hsqldb.Server se usa generalmente para iniciar un proceso independiente, puede crear instancias y configurarlo en la prueba unitaria, lo que debería permitir que un proceso remoto se conecte y consulte la base de datos.

O bien, tendrá que escribir algún tipo de funcionalidad de volcado que se llame desde su unidad de prueba según sea necesario.

Como un lado, el uso de HSQL en pruebas de unidad solo está probando que su código funciona en contra de HSQL, que es diferente a la base de datos real. Esto significa que puede obtener falsos positivos y viceversa. Lo mismo se puede lograr con una API burlona o mejor, guarde las pruebas de base de datos para algunas pruebas de integración decentes que funcionan con la base de datos real.

+1

¡Gracias por su respuesta! Lo he descubierto y funciona si tienes hsqldb escribe en el archivo y usa esa url para conectarte. Estaba usando un controlador anterior que estaba en mi camino. Estoy de acuerdo en que también debes probarlo en una base de datos real, lo cual también hacemos, pero tener las consultas SQL validadas es más valioso que ridiculizarlo, diría yo. – Albert

66

En la prueba de unidad o en el método @Before/setUp(), se puede añadir la siguiente línea al iniciar el Administrador de Base de Datos HSQL:


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

o para la versión oscilación mejorado


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

El El administrador de base de datos le permite inspeccionar su esquema y ejecutar consultas SQL en la base de datos en memoria en vivo mientras se ejecuta la aplicación.

Asegúrese de establecer un punto de pausa o detener la ejecución de una forma u otra si desea verificar el estado de su base de datos en una línea específica.

+0

Tenga en cuenta que omití la parte "sql.enforce_strict_size = true" de la URL de JDBC, no estoy seguro de cuál sería el efecto aquí ... – dimdm

+4

Cuando hago lo que sugiere, el DatabaseManager se inicia, pero se congela. No puedo hacer nada con eso. Si forzo a abandonarlo, la sesión de depuración también fallece. Estoy usando Intellij Idea 11.1.2. –

+2

Consulte aquí (http://stackoverflow.com/questions/11435654/connect-to-in-memory-hsql-hypersonic-database-with-databasemanager-while-debug/11437102#11437102) para ver una discusión sobre cómo mantener DatabaseManager de congelación. –

13

Ejecutar la prueba de la unidad a un punto de ruptura, a continuación, en la perspectiva de depuración de Eclipse, abra la vista de pantalla (Ventana, Mostrar vista, Display) e introduzca

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

(como por mensaje de dimdm), resáltalo , haga clic derecho y seleccione Ejecutar.

+0

El Administrador de base de datos HSQL se congela al ejecutar SQL al igual que la publicación de @dimdms. – yellavon

+1

@yellavon configure en su punto de corte IDE para no congelar todos los hilos – deFreitas

0

También podría usar la clase DatabaseManagerSwing incluida en [HSQLDB] [1] pasando a ella una conexión abierta, que le permite ver el estado de la base de datos en la transacción en la que se encuentra la conexión.

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