¿Cómo crear pruebas unitarias contra bases de datos que no están en la memoria, como MySQL en el marco de Play, y restablecer el estado conocido?

Quiero crear pruebas unitarias que cubran el código que usa la base de datos relacional en Play framework 2.1.0. Hay muchas posibilidades para esto y todos causan problemas:

Pruebas en base de datos H2 en memoria

La documentación de Play Framework propone ejecutar pruebas unitarias en la base de datos en memoria H2, incluso si la base de datos principal utilizada para el desarrollo y la producción utiliza otro software (es decir, MySQL):

app = Helpers.fakeApplication(Helpers.inMemoryDatabase());

Mi aplicación no usa funciones RDBMS complicadas, como los procedimientos almacenados y la mayoría de los casos de acceso a bases de datos son llamadas a ebean, por lo que debe ser compatible con MySQL y H2.

Sin embargo, las declaraciones de creación de tablas en evoluciones utilizan características específicas de MySQL, como la especificación deENGINE = InnoDB, DEFAULT CHARACTER SET = utf8, etc. Me temo que si elimino estas partes propietarias deCREATE TABLEMySQL utilizará una configuración predeterminada que no puedo controlar y que depende de la versión, por lo que para probar y desarrollar la configuración principal de MySQL de la aplicación se debe modificar.

¿Alguien utilizó este enfoque (haciendo que las evoluciones sean compatibles con MySQL y H2)?

Otras ideas de cómo se puede manejar:

Evoluciones separadas para MySQL y H2 (no es una buena idea)Alguna forma de hacer que H2 ignore cosas de MySQL adicionales encreate table (El modo de compatibilidad de MySQL no funciona, todavía se queja incluso endefault character set). No se comoPrueba en el mismo controlador de base de datos que la base de datos principal

La única ventaja de la base de datos en memoria H2 es que es rápida, y las pruebas en el mismo controlador de base de datos que en la base de datos dev / production pueden ser mejores, ya que están más cerca del entorno real.

¿Cómo se puede hacer bien en Play framework?

Intentó:

Map<String, String> settings = new HashMap<String, String>();
settings.put("db.default.url", "jdbc:mysql://localhost/sometestdatabase");
settings.put("db.default.jndiName", "DefaultDS");
app = Helpers.fakeApplication(settings);

Parece que las evoluciones funcionan aquí, pero ¿cuál es la mejor forma de limpiar la base de datos antes de cada prueba? ¿Creando código personalizado que trunca cada tabla? Si se eliminarán las tablas, las evoluciones se ejecutarán nuevamente antes de la próxima prueba, o se aplicarán una vez porplay test ¿mando? O una vez porHelpers.fakeApplication() ¿invocación?

¿Cuáles son las mejores prácticas aquí? Escuche dedbunit, ¿es posible integrarlo sin mucho dolor y peculiaridades?

Respuestas a la pregunta(5)

Su respuesta a la pregunta