Como criar testes de unidade contra banco de dados não em memória, como o MySQL no framework Play, com a reconfiguração para o estado conhecido?

Eu quero criar testes de unidade que cobrem código que usam banco de dados relacional no framework Play 2.1.0. Existem muitas possibilidades para isso e todas causam problemas:

Teste em banco de dados H2 em memória

A documentação da estrutura do Play propõe executar testes de unidade no banco de dados de memória H2, mesmo se o banco de dados principal usado para desenvolvimento e produção usar outro software (por exemplo, MySQL):

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

Meu aplicativo não usa recursos RDBMS complicados, como procedimentos armazenados, e a maioria dos casos de acesso ao banco de dados são chamados ebean, portanto, ele deve ser compatível com o MySQL e o H2.

No entanto, as instruções de criação de tabelas em evoluções usam recursos específicos do MySQL, como especificarENGINE = InnoDB, DEFAULT CHARACTER SET = utf8Tenho medo de remover essas partes proprietárias deCREATE TABLE, O MySQL irá usar alguma configuração padrão que eu não posso controlar e que depende da versão, então testar e desenvolver a configuração principal do aplicativo MySQL deve ser modificada.

Alguém usou essa abordagem (tornando as evoluções compatíveis com o MySQL e H2)?

Outras idéias como pode ser tratado:

Evoluções separadas para o MySQL e H2 (não é uma boa ideia)Alguma maneira de fazer H2 ignorar outras coisas do MySQL emcreate table (O modo de compatibilidade do MySQL não funciona, ele ainda reclama mesmodefault character set). Eu não sei comoTestando no mesmo driver de banco de dados como banco de dados principal

A única vantagem do banco de dados de memória H2 é rápido, e testar no mesmo driver de banco de dados que o banco de dados de desenvolvimento / produção pode ser melhor, porque está mais próximo do ambiente real.

Como isso pode ser feito corretamente no framework Play?

Tentou:

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 as evoluções funcionam aqui, mas como é melhor limpar o banco de dados antes de cada teste? Criando código personalizado que trunca cada tabela? Se cair as tabelas, as evoluções serão executadas novamente antes do próximo teste ou serão aplicadas uma vez porplay test comando? Ou uma vez porHelpers.fakeApplication() invocação?

Quais são as melhores práticas aqui? Ouví sobredbunit, é possível integrá-lo sem muita dor e peculiaridades?

questionAnswers(5)

yourAnswerToTheQuestion