2011-02-14 18 views
41

Tuve algunas pruebas de JUnit ya escritas en mi proyecto que solían rellenar 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.¿Cómo puedo borrar los datos de mi HSQLDB después de cada prueba?

Respuesta

73
  1. Puede borrar los datos al soltar 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 PÚBLICA CASCADE

  2. Como alternativa, si necesita las definiciones de tabla y el esquema de objetos, puede crear un archivo: base de datos que contiene los objetos pero no datos y añada el siguiente listado en el fichero .properties. El uso de este tipo de base de datos para las pruebas, los cambios en los datos no se conservan

    files_read_only = true

  3. La última alternativa, disponible en HSQLDB 2.2.6 y más tarde le permite borrar todos los datos en un esquema mientras manteniendo las tablas. En el siguiente ejemplo, el esquema PÚBLICO se borra. pública

    TRUNCATE esquema y COMMIT

    Esta declaración se ha mejorado en las últimas versiones de HSQLDB. Ver http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement según la Declaración Truncar

+0

Esto eliminará todas las tablas en el esquema. Sin embargo, mi requisito es que necesito las tablas pero no hay datos en ellas. – Robin

+1

Enfoque alternativo agregado. – fredt

+1

# 3 funciona muy bien para mí. Por varias razones, no puedo deshacer entre los métodos de prueba, así que hice un método @@ After @@ Transactional que toma el administrador de la entidad y lo ejecuta. –

9

Lo que hacemos en todas nuestras pruebas es que retrotraemos la transacción al final de la ejecución (después de que todas las aserciones se hayan completado). 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 hacer rodar su propio bloque try {} finally {} para deshacer una transacción iniciada para cada prueba.

+2

Esta es una buena idea si sólo se está probando una sola transacción. Es posible que la prueba abarque múltiples transacciones. –

16

Siguiendo el consejo fredt 's, TRUNCATE ESQUEMA PÚBLICA REINICIO DE IDENTIDAD Y COMMIT NO COMPROBAR trabajaron para mi. 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 IDENTIDAD REINICIAR, todas las secuencias tabla de identidad y todos los objetos secuencia en el esquema se restablecen a sus valores iniciales

1

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

TRUNCATE SCHEMA public AND COMMIT; 

pero se han topado con problemas de bloqueo entre las pruebas y la adición de esta trabajado para mí como un encanto:

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

¿de dónde viene 'entityManager'? –

+0

Como estaba usando JPA en mi proyecto junto con Spring para DI, el corrector de pruebas me lo inyectó. –

Cuestiones relacionadas