Usando um HSQLDB ad-hoc na memória para fins de teste em um aplicativo Spring Roo

Testar o código que envolve a atualização de um banco de dados não é fácil de fazer em um ambiente de integração contínua, pois pode poluir o banco de dados com dados inúteis ou, pior ainda, deixá-lo em um estado inconsistente.

Uma boa maneira de fazer isso seria criar dinamicamente um banco de dados na memória no momento da execução do teste para ser descartado após a execução dos testes; Na verdade, o Spring permite usar uma unidade de persistência diferente e uma fonte de dados diferente no momento do teste, mas existem alguns truques para habilitar esse comportamento, particularmente em um aplicativo Roo.

O que você normalmente deseja fazer é adicionar outro arquivo xml applicationContext (vamos chamá-lo de applicationContext-test.xml) em src / test / resources, idêntico ao que você já tem em src / main / resources, e anotar sua classe de teste com @ContextConfiguration (locations = {“classpath: ** / META-INF / applicationContext-test.xml”}) para que seu teste seja executado com um contexto Spring; você pode então alterar a fonte de dados para ficar assim:

<bean class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" id="dataSource">
<property name="driverClassName" value="org.hsqldb.jdbcDriver" />
<property name="url" value="jdbc:hsqldb:mem:testdb" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>

(Observe que para que o HSQLDB funcione, você também deve incluí-lo como uma dependência em seu pom.xml, com escopo “teste”)

Agora, a próxima coisa a fazer é atualizar a unidade de persistência para usar o dialeto SQL do HSQLDB, e o bom senso sugeriria colocar outro persistence.xml em src / test / resources, mas (aqui está a pegadinha) ele não detectará seus mapeamentos Hibernate .

Para que funcione, você deve incluir outra tag <persistenceUnit> em seu src / main / resources / persistence.xml que deve ser semelhante a:

<persistence-unit name="testPersistenceUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
<property name="hibernate.connection.charSet" value="UTF-8"/>
<property name="hibernate.show_sql" value="true"/>
</properties>
</persistence-unit>

(Observe também que hbm2ddl.auto é definido como “criar-drop” para que o esquema de banco de dados seja criado novamente em cada execução de teste)

Colocando as duas unidades de persistência no mesmo arquivo persistence.xml, misteriosamente, os mapeamentos do Hibernate são resolvidos corretamente e você pode persistir (), mesclar () e consultar seus objetos dentro de seus testes sem poluir o banco de dados de sua aplicação.

Você também pode inicializar seu banco de dados com alguns dados de carregamento inicial, colocando um jdbc: initializeDatabase em seu applicationContext-test.xml e especificando quais arquivos .sql, localizados em seu classpath, devem ser executados.