Utilizando o HSQLDB como banco embarcado para testes unitários

Você já precisou subir uma aplicação em algum lugar sem a necessidade de que exista um banco de dados configurado para suportar essa aplicação?
Para resolver esse entre outros problemas utilizamos bancos de dados embarcados na aplicação.

O exemplo mais comum se dá através da necessidade de executar testes unitários que tenham acesso ao banco de dados e que não corrompam o banco que a aplicação está utilizando. Muitos chamam de “banco quente”, “banco de produção” etc…

Talvez você nunca tenha ouvido falar de testes unitários e muito menos de JUnit, mas dessa vez não iremos entrar no detalhe do que são testes unitários.

Atualmente existem diferentes tipos de banco de dados embarcados, como: HSQLDBDerbySQLite e outros. Hoje vamos falar e exemplificar sobre o HSQLDB.

hypersql_logo

Para podermos utilizar o HSQLDB no java, primeiramente fazemos a inserção da dependência no pom.xml.

		<dependency>
			<groupId>org.hsqldb</groupId>
			<artifactId>hsqldb</artifactId>
			<version>2.2.9</version>
			<scope>test</scope>
		</dependency>

Após configurado a dependência e baixado o jar através do comando no maven:

mvn eclipse:eclipse

… podemos seguir com os ajustes necessários, configurando o persistence.xml.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>

            <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:meubanco"/>
            <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>

        </properties>
    </persistence-unit>
</persistence>

Como no meu caso estou utilizando o HSQLDB apenas para meus testes unitários, o persistence.xml fica dentro da pasta:

src\test\resources\META-INF\persistence.xml

Se vocês observarem também a configuração do persistence.xml tem o persistence-unit como “test”.

<persistence-unit name="test" transaction-type="RESOURCE_LOCAL">

Isso é para garantir que o EntityManager carregue as configurações de persistência de testes. Além disso foi necessário criar um BlockJUnit4ClassRunner

public class ExemploJUnit4Runner extends BlockJUnit4ClassRunner {

	public ExemploJUnit4Runner(Class<?> klass) throws InitializationError {
		super(klass);

		//carrega o EntityManager com o persistenceUnit = test
		EntityManagerTestLoader.load();
	}
}
public class EntityManagerTestLoader {

	private static final String PERSISTENCE_UNIT_TEST = "test";

	public static void load(){
		EntityManagerUtils.loadEntityManager(PERSISTENCE_UNIT_TEST);
	}
}

E por fim anotar os testes unitários com @RunWith(ExemploJUnit4Runner.class).

@RunWith(ExemploJUnit4Runner.class)
public class ExemploTest {

	@Test
	public void testInsert(){
		//aqui vai o seu teste
	}
}

O RunWith vai garantir que o EntityManager tenha carregado as informações de persistência do ambiente de teste.

Concluindo… Esse é apenas um exemplo de utilização de banco de dados embarcado. Compartilhem suas experiências nos comentários.

Grande abraço

2 responses to “Utilizando o HSQLDB como banco embarcado para testes unitários

  1. Boa tarde Cezar… Desculpa pela demora.
    O EntityManagerUtils é de fato uma classe que eu criei para fazer o load das configurações do entity manager (hibernate) a partir de um PERSISTENCE_UNIT específico.
    Pior que nem sei se ainda tenho esse fonte porque já não utilizo mais essa estrutura em meus projetos.

Leave a Reply

Your email address will not be published. Required fields are marked *