Pregunta

Quiero limpieza de la base de datos después de cada caso de prueba, sin deshacer la transacción. He tratado de DBUnit DatabaseOperation.DELETE_ALL , pero no funciona si una deleción viola una extranjera restricción de clave. Sé que puedo desactivar la revisión de las llaves extranjeras, pero que también podría desactivar los controles para las pruebas (que yo quiero evitar).

Estoy usando JUnit 4, JPA 2.0 (EclipseLink), y la base de datos en la memoria de Derby. Algunas ideas?

Gracias, Theo

¿Fue útil?

Solución

simple: Antes de cada prueba, iniciar una nueva transacción y después de la prueba, rollo de nuevo. Eso le dará la misma base de datos que tenía antes.

Asegúrese de que las pruebas no crean nuevas transacciones; reutilizar en lugar de la existente.

Otros consejos

La forma más sencilla de hacer esto probablemente está usando el método de la APP nativeQuery.

@After
public void cleanup() {
    EntityManager em = entityManagerFactory.createEntityManager();
    em.getTransaction().begin();
    em.createNativeQuery("truncate table person").executeUpdate();
    em.createNativeQuery("truncate table preferences").executeUpdate();
    em.getTransaction().commit();
}

Sí, en transacción de prueba podría hacer su vida mucho más fácil, pero si la transacción es su cosa entonces es necesario aplicar la compensación de transacciones (s) durante la limpieza (en @After). Suena laboriosa y que podría ser, pero si se aborda adecuadamente puede acabar con un conjunto de métodos de ayuda (en pruebas) que compensan datos (limpieza) acumulados durante @Before y pruebas (usando JPA o JDBC recta - lo que tenga sentido).

Por ejemplo, si utiliza la APP y el llamado a crear métodos en entidades durante las pruebas se puede utilizar (usando AOP si te apetece o simplemente métodos de ensayo auxiliares como nosotros) un patrón en todas las pruebas a:

  1. IDs de pista de todas las entidades que se han creado durante la prueba
  2. ellos se acumulan en orden creado
  3. eliminaciones entidad repetición de estas entidades en el orden inverso en @After

Estoy un poco confundido en cuanto DBUnit se reinicializar la base de datos a un estado conocido antes de cada prueba.

También recomiendan como una buena práctica no para la limpieza o cambiar los datos después de la prueba.

Por lo tanto si se trata de la limpieza que está buscando para preparar el PP para la próxima prueba, no me molestaría.

Mi configuración es bastante similar: Derby (incrustado) + + 1.2.2 OpenJPA DBUnit. Aquí es cómo manejar las pruebas de integración para mi tarea actual: en cada método @Before corro 3 guiones:

  1. gota DB -. Una secuencia de comandos SQL que cae todas las tablas
  2. Crear DB -. Una secuencia de comandos SQL que recrea ellos
  3. Una secuencia de bloque de XML DB-prueba específica para rellenar los datos.

Mi base de datos tiene sólo 12 mesas y el conjunto de datos de prueba no es muy grande, ya sea - sobre 50 registros. Cada script tarda unos 500 ms para funcionar y les mantiene manualmente cuando se añaden o modifican tablas.

Este enfoque es, probablemente, no se recomienda para las pruebas de grandes bases de datos, y tal vez ni siquiera puede considerarse una buena práctica para los más pequeños; sin embargo, tiene una ventaja importante sobre deshacer la transacción en el método @After:. en realidad se puede detectar lo que sucede durante la confirmación (como la persistencia de entidades separadas o excepciones bloqueo optimista)

Mejor tarde que nunca ... Sólo tenía el mismo problema y rodeó una solución bastante simple:

  1. establecer la propiedad " ... database.action " con el valor " drop-and-crear " en su persistence-unit config
  2. cerrar la entidad-manager y la fábrica de entidad-manager después de cada prueba

persistence.xml

    <persistence-unit name="Mapping4" transaction-type="RESOURCE_LOCAL" >
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>...</class>
    <class>...</class>

    <properties>
        ...
        <property name="javax.persistence.schema-generation.database.action" value="drop-and-create" />
        ...
    </properties>
</persistence-unit>

Unidad-test:

...
@Before
public void setup() {
    factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
    entityManager = factory.createEntityManager();
}


@After
public void tearDown() {
    entityManager.clear();
    entityManager.close();
    factory.close();
}

...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top