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”]

<!DOCTYPE hibernate-configuration PUBLIC

”-//Hibernate/Hibernate Configuration DTD 3.0//EN”

“http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd”>

com.mysql.jdbc.Driver jdbc:mysql://192.168.0.2:3306/faceted?autoReconnect=true root org.hibernate.dialect.MySQLDialect create-drop <!– Classes anotadas –>

[/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”]

[/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 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”]

mysql mysql-connector-java 5.1.27 test junit junit 4.11 test org.dbunit dbunit 2.4.5 test

[/sourcecode]

Allan de Queiroz

Allan de Queiroz
London based software engineer

XServer forward from Linux text mode for Headless purposes.

Hello, this post is about XServer forward from Linux text mode, **not ssh forward, anything related to VNC** or things like that.Recently...… Continue reading