2010-09-05 15 views
6

Las pruebas de mi unidad utilizan Hibernate para conectarse a una base de datos HSQLDB en memoria. Esperaba que hubiera una forma de limpiar y recrear la base de datos (toda la base de datos, incluidos el esquema y todos los datos) en el método TestCase.setUp() de JUnit.Borrado de toda la base de datos (para pruebas unitarias con Hibernate)

+3

Si está probando su base de datos, a continuación, se imo no es prueba unitaria – Jamie

+0

Estoy probando mi programa que usa la base de datos. –

+0

Estoy probando una clase que se utiliza para acceder a los datos en la base de datos – Lu55

Respuesta

7

puede configurar el archivo de configuración de hibernación para obligar a la base de datos a volver a crear las tablas y el esquema cada vez.

<!-- Drop and re-create the database schema on startup --> 
<property name="hbm2ddl.auto">create-drop</property> 

hibernate.hbm2ddl.auto valida automáticamente o exportaciones DDL de esquema para la base de datos cuando se crea la SessionFactory. Con create-drop, el esquema de la base de datos se eliminará cuando SessionFactory se cierre explícitamente.

p. Ej. validar | actualización | crear | create-drop

si no desea tener esta configuración en su configuración real de hibernación, puede crear una configuración de hibernación para la prueba de la unidad.

+3

Esto solo lo recrea cada ejecución. Esto significa que si está ejecutando sus pruebas de eclipse, fallarán muchas y eso pasaría si se ejecutara solo. Al menos esta es mi experiencia. –

2
hibernate.hbm2ddl.auto=create-drop 

Y arranca un nuevo SessionFactory.

+2

¿cómo se hace esto cuando se usa solo JPA? – Konsumierer

0

Desde la perspectiva de pruebas, la mejor práctica es para borrar los datos después de cada prueba individual. Si usa crear-soltar, también soltará el esquema de la tabla. Esto provoca una sobrecarga al recrear el esquema cada vez.

Dado que está utilizando hsql, que proporciona un mecanismo directo para truncar, sería la mejor opción en este caso.


@After 
public void clearDataFromDatabase() { 
    //Start transaction, based on your transaction manager 
    dao.executeNativeQuery("TRUNCATE SCHEMA PUBLIC AND COMMIT"); 
    //Commit transaction 
} 
1

tener cuidado con que limpia el mundo y empezar de nuevo cada vez. Pronto, es probable que desee comenzar con un conjunto "predeterminado" de datos de prueba cargados en su sistema. Por lo tanto, lo que realmente desea es volver a ese estado base antes de ejecutar cada prueba. En este caso, desea una transacción que retrocede antes de cada ejecución de prueba.

Para lograr esto, se debe anotar la clase JUnit:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"classpath:/path/to/spring-config.xml"}) 
@TransactionConfiguration(transactionManager="myTransactionManager", defaultRollback=true) 
public class MyUnitTestClass { 
... 
} 

Y luego anotar cada uno de sus métodos de prueba con @Transactional:

@Transactional 
@Test 
public void myTest() { 
    ... 
} 
Cuestiones relacionadas