Dúvida: Teste de DAO's

Dúvida: Teste de DAO's

por Filipe Ferraz Salgado -
Número de respostas: 2
Olá,

quando fui começar os testes fiquei em dúvida sobre como deveria testar os DAO's, levando em conta aquilo que foi dito na apresentação que é bom que os testes rodem em qualquer máquina e tal.

Enfim, a dúvida foi em relação à conexão com o banco de dados. Pesquisei um pouco e vi que as pessoas costumam usar mocks (mencionados rapidamente no final da apresentação). Um que parece ser comumente utilizado é o EasyMock. Outras pessoas usam o HSQLDB na hora dos testes. Ou ainda, rodam os testes e depois dão rollback.

Gostaria que vocês explicassem como pode ser feito o teste dos DAO's (e aproveitando o tópico, o teste das servlets) com o JUnit. Se possível, coloquem um exemplo simples por favor.

desde já, obrigado
filipe
Em resposta à Filipe Ferraz Salgado

Re: Dúvida: Teste de DAO's

por Mauricio De Diana -
Olá.

Se o objetivo é realmente testar o acesso a dados feito pelos DAOs é necessário fazer os testes usando um banco de dados real, e não um DB mocked. Para isso, o HSQLDB é provavelmente a melhor opção (o Apache Derby é outra).

Alguns artigos sobre JUnit e HSQLDB:

Unit test JPA Entities with in-memory database

Unit testing database access using JPA (esse exemplo também faz uso do DbUnit)

Enterprise Java Community: Unit-Testing Hibernate With HSQLDB

O DbUnit pode ajudar bastante nos testes, em especial na hora de popular o DB com os dados para os testes e na hora de fazer as asserções. Com ele você não precisa fazer um SELECT para checar se o INSERT foi bem sucedido, por exemplo. Você pode definir o que espera que esteja em uma ou mais tabelas após o INSERT em um XML, e usar as asserções disponibilizadas pelo DbUnit para checar se o conteúdo no DB está de acordo.

Sobre mocks, antes de mais nada, a leitura de Mocks Aren't Stubs é recomendada para se entender a teoria por trás dessa técnica. Em Java acho que os dois frameworks mais conhecidos e utilizados são o EasyMock, o jMock e o Mockito. Desses só usei o EasyMock, então não tenho opinião sobre as vantagens e desvantagens de cada um, mas uma busca por eles resultará em vários posts e artigos comparando-os.

Servlets são mais difíceis de serem testadas com testes unitários, normalmente isso fica para os testes de integração / aceitação, pois na maioria das vezes os testes são um pouco complicados de serem escritos. Mas existem algumas alternativas. Uma é passar mocks de HttpServletRequest e HttpServletResponse para doGet(), doPost(), etc. E também existem alguns frameworks para testes de servlets, como o MockRunner e o ServletUnit. Como nunca usei nenhum deles, não tenho como fazer uma recomendação.

Espero ter ajudado. Se tiver outras dúvidas é só mandar.

Abraços.