DBUnit e Hibernate.

Hoje precisei realizar alguns testes de integração com o banco de dados, pesquisei um pouco comparei as abordagens e decidi pela utilização do DBUnit.
Com ele é possível popular a base de dados com um conjunto de dados pré-definidos antes da execução de cada teste, para isso ele faz uso de ‘datasets’ preenchidos por nós. Então vamos ver como fazer isso, configurar o hibernate, gerar os ‘datasets’, testar com DBUnit.
No meu caso, tenho uma uma aplicação standalone que conecta-se em um servidor MySql, então meu hibernate.cfg.xml e meu HibernateUtil.java ficaram assim:

[sourcecode language=”xml” wraplines=”false” collapse=”false” gutter=”false”]
<?xml version=’1.0′ encoding=’utf-8′?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>

<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

<property name="hibernate.connection.url">jdbc:mysql://192.168.0.2:3306/faceted?autoReconnect=true</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">create-drop</property>

<!– Classes anotadas –>
<mapping class="co.mutt.fun.model.Empresa"/>
<mapping class="co.mutt.fun.model.Estado"/>

</session-factory>
</hibernate-configuration>
[/sourcecode]

[sourcecode language=”java” wraplines=”false” collapse=”false” gutter=”false”]
public class HibernateUtil {

private static final SessionFactory sessionFactory = buildSessionFactory();

private static SessionFactory buildSessionFactory() {
return new AnnotationConfiguration().configure().buildSessionFactory();
}

public static Session openSession(){
return HibernateUtil.getSessionFactory().openSession();
}

private static SessionFactory getSessionFactory() {
return sessionFactory;
}

public static Connection getConnection(Session session) {
final Connection[] connection = new Connection[1];
session.doWork(new Work() {
public void execute(Connection con) throws SQLException {
connection[0] = con;
}

});
return connection[0];
}

}
[/sourcecode]

Agora que conseguimos conectar com o banco de dados, vamos criar os datasets para realizarmos nosso primeiro teste com o DBUnit, para isso, vamos exportar os dados através de um exportados de datasets.

[sourcecode language=”java” wraplines=”false” collapse=”false” gutter=”false”]
public class DatasetExporter {

@Test
public void export() throws Exception {
generateDataSet("Empresa","select * from Empresa");
}

public void generateDataSet(String table, String query) throws Exception{
Session session = HibernateUtil.openSession();
Connection jdbcConnection = HibernateUtil.getConnection(session);
IDatabaseConnection connection = new DatabaseConnection(jdbcConnection);

QueryDataSet dataSet = new QueryDataSet(connection);
dataSet.addTable(table, query);

FlatDtdDataSet.write(dataSet, new FileOutputStream(table+".dtd"));
FlatXmlDataSet.write(dataSet, new FileOutputStream(table+".xml"));

jdbcConnection.close();
}
}
[/sourcecode]

Você não precisa executa-lo com um teste unitário, o importante é entender que você precisa fornecer as queries para buscar os dados que você quer utilizar em seus testes e que dois arquivos serão criados, um xml com os dados e um dtd para validar os dados desse xml. Veja os arquivos gerados:

[sourcecode language=”xml” wraplines=”false” collapse=”false” gutter=”false”]
<!ELEMENT dataset (
Empresa*)>

<!ELEMENT Empresa EMPTY>
<!ATTLIST Empresa
id CDATA #REQUIRED
ativa CDATA #IMPLIED
nome CDATA #IMPLIED
>
[/sourcecode]

[sourcecode language=”xml” wraplines=”false” collapse=”false” gutter=”false”]
<?xml version=’1.0′ encoding=’UTF-8′?>
<dataset>
<Empresa id="1" ativa="1" nome="MUTT CO"/>
<Empresa id="2" ativa="1" nome="DELICIAS"/>
<Empresa id="3" ativa="1" nome="ESTRELA FRIOS E LATICINIOS"/>
<Empresa id="4" ativa="1" nome="TRANSPORTES SOARES"/>
</dataset>
[/sourcecode]

Agora vamos enfim ao teste em si.

[sourcecode language=”java” wraplines=”false” collapse=”false” gutter=”false”]
public class EmpresaTest {

private static final String EMPRESA_DATASET = "dbunit/Empresa.xml";

private Session session;
private IDatabaseConnection databaseConnection;

@Before
public void setUp() throws Exception {
session = HibernateUtil.openSession();
databaseConnection = new DatabaseConnection(HibernateUtil.getConnection(session));
DatabaseOperation.CLEAN_INSERT.execute(databaseConnection, getDataSet(EMPRESA_DATASET));
}

private IDataSet getDataSet(String datasetFile) throws Exception {
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(datasetFile);
IDataSet dataset = new FlatXmlDataSet(inputStream);
return dataset;
}

@Test
public void test() throws Exception {
List<Empresa> empresas = session.createCriteria(Empresa.class).list();
Assert.assertTrue(!empresas.isEmpty());
}
}
[/sourcecode]

E para finalizar, as dependências:

[sourcecode language=”xml” wraplines=”false” collapse=”false” gutter=”false”]
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.dbunit</groupId>
<artifactId>dbunit</artifactId>
<version>2.4.5</version>
<scope>test</scope>
</dependency>
[/sourcecode]

Leave a Reply