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.
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
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
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.
Otra solución se incluye en "Borrar la base de datos entre pruebas" http://www.objectpartners.com/2010/11/09/unit-testing-your-persistence-tier-code/
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();
}
}