mem lobs instalar java hibernate junit hsqldb

java - lobs - jdbc hsqldb mem



¿Cómo puedo borrar los datos de mi HSQLDB después de cada prueba? (5)

Tuve algunas pruebas de JUnit ya escritas en mi proyecto que solían completar datos en el método de configuración. Ahora he agregado maven a mi proyecto y quiero ejecutar todos los casos de prueba de maven, es decir, usando la prueba mvn. El problema ahora es que mi base de datos no se borra después de que se haya ejecutado cada clase de prueba. Necesito borrar el HSQLDB después de que se hayan ejecutado los casos de prueba de cada clase.


  1. Puede borrar los datos al descartar el esquema. El esquema predeterminado se llama PUBLIC. Si ejecuta el estado de SQL a continuación, borrará todos los datos y descartará todas las tablas.

    DROP SCHEMA PUBLIC CASCADE

  2. Alternativamente, si necesita las definiciones de objeto de tabla y esquema, puede crear un archivo: una base de datos que contenga los objetos pero sin datos, y agregue la propiedad que se encuentra debajo al archivo .properties. Usando este tipo de base de datos para las pruebas, los cambios a los datos no se mantienen

    files_read_only = true

  3. La última alternativa, disponible en HSQLDB 2.2.6 y posteriores, le permite borrar todos los datos en un esquema mientras mantiene las tablas. En el siguiente ejemplo, el esquema PÚBLICO se borra.

    TRUNCATE SCHEMA public Y COMMIT

    Esta declaración se ha mejorado en las últimas versiones de HSQLDB. Consulte http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement en Truncate Statement


Lo que hacemos en todas nuestras pruebas es que retrotraemos la transacción al final de la ejecución (una vez finalizadas todas las aserciones). Usamos Spring y las pruebas predeterminadas no se comprometen al final. Esto garantiza que siempre regrese al estado inicial de la base de datos (después de la creación inicial de las tablas de entidades y la ejecución de import.sql).

Incluso si no usa Spring, probablemente pueda ejecutar su propio bloque try {} finally {} para deshacer una transacción iniciada para cada prueba.



Siguiendo el consejo de Fredt , TRUNCATE SCHEMA RESTABLECE LA IDENTIDAD Y NO A funcionó para mí. Parte relevante del código en la prueba JUnit para DAO.

@After public void tearDown() { try { clearDatabase(); } catch (Exception e) { fail(e.getMessage()); } } public void clearDatabase() throws Exception { DataSource ds = (DataSource) SpringApplicationContext.getBean("mydataSource"); Connection connection = null; try { connection = ds.getConnection(); try { Statement stmt = connection.createStatement(); try { stmt.execute("TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK"); connection.commit(); } finally { stmt.close(); } } catch (SQLException e) { connection.rollback(); throw new Exception(e); } } catch (SQLException e) { throw new Exception(e); } finally { if (connection != null) { connection.close(); } } }

De acuerdo con la documentación en http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement

Si se especifica RESTART IDENTITY, todas las secuencias de IDENTITY de la tabla y todos los objetos SEQUENCE en el esquema se restablecen a sus valores de inicio


Tenía un script SQL simple que se ejecutó antes de cada prueba con la siguiente declaración al comienzo:

TRUNCATE SCHEMA public AND COMMIT;

pero me he encontrado con problemas de bloqueo entre pruebas y agregué que esto funcionó para mí como un encanto:

@After public void after() throws Exception { if (entityManager.getTransaction().isActive()) { entityManager.getTransaction().rollback(); } }