Alguem tem algum exemplo de teste no JUNIT no DAO

estou aprendendo JUNIT, e estou sentindo pouco de dificuldade. alguém tem alguma exemplo de teste no JUNIT testando um dao ou algo do tipo.

Dayson,

O teu DAO faz conexões diretas com o banco de dados, utilizando JDBC? Se sim, o que você está procurando pode ser feito de duas maneiras:

  1. Você vai utilizar um banco de dados em memória, que vai estar ligado durante o teste e será desligado no final. Uma espécie de “mock” do DB
  2. Você vai utilizar um banco de dados real, rodando na tua máquina.

A primeira opção é mais ou menos um teste de unidade, e a segunda é um teste de integração.

Eu não tenho nenhum exemplo para te mostrar como isso funciona, mas existem ferramentas especializadas em resolver esse problema pra você. Dá uma olhadinha no DBUnit!

É uma extensão do JUnit para te ajudar a fazer testes que envolvem bancos de dados. Funciona mais ou menos assim:

  1. Você define o estado inicial do banco, utilizando formatos conhecidos como JSON, XML, YML, etc (a ferramenta vai interpretar e gerar o SQL para fazer a inserção dos dados);
  2. Você toma ações dentro do teste, como salvar uma entidade, ou alterar algo, ou buscar algo;
  3. Você faz asserts do JUnit, em casos como busca, onde você sabe exatamente o que tem dentro do banco (por causa do passo 1) e portanto sabe o que deve vir nas pesquisas;
  4. Você instrui o DBUnit a fazer uma varredura do banco e verificar se ele se encontra em um estado que você espera (para o caso de inserts/updates), de uma forma extremamente parecida com o passo 1.

Com certeza devem existir outras ferramentas. Inclusive, você também pode fazer tudo isso manualmente, mas convenhamos: é um saco, e vai dar MUITO trabalho.

Dá para usar o DBUnit com JPA também, o que se torna uma atividade extremamente produtiva. Eu utilizo nos meus projetos e acho bem útil!

E realmente, como o @nel falou, também não acho interessante ficar fazendo teste de integração. Acho o teste End to End (ou Acceptance, ou Functional, como queira) bem mais interessante para testar a lógica de busca e persistência dos dados, porque engloba o teu teste do DB e de quebra ainda testa as funcionalidades da aplicação inteira, de ponta a ponta, da view ao db. Para fazer isso, eu to usando o Arquillian. Inclusive, fiz uma pergunta uns dias atrás para saber o que o pessoal gostava de utilizar, mas ninguém respondeu :disappointed:

@Dayson_Rodrigues na minha opinião, você nem deveria estar pensando em teste unitário para o seu DAO, salvo se usar uma API como QueryDSL, no qual consegue testar a query em si, mas não os valores em banco.

Se está pensando em validar conteúdo em banco e algo do genêro, não estamos mais falando em testes unitários. Dê uma lida sobre testes end-to-end e integração.

Pode compartilhar conosco como tem sido sua experiência com Arquillian?

humm valeu pela dica, no caso seria um teste de unidade. Ou seja, seria testar um método por exemplo “teste de unidade”. Se sim é isso aí, infelizmente sou novo na área ai tudo vira novidade.

Tem sido bem interessante. O único problema, pra mim, é que eu não vejo ninguém utilizando isso. Estou muito curioso para saber como que são feitos os testes em empresas maiores (se é que são feitos de forma automatizada) nesse sentido.

Estou usando a extensão do Arquillian que usa DBUnit pra manipular o estado do banco de dados, é algo que tem me ajudado bastante na parte dos testes end to end.

Eu comecei a estudar TDD e aplicar de verdade há pouco tempo, e o único arrependimento meu é não ter começado antes.

Fica muito fácil de ver quando as coisas quebram e, mais importante, a gente cria o sistema pensando em suas funcionalidades, do ponto de vista do usuário programador, quando escreve o teste do jeito que gostaria que o sistema funcionasse, para finalmente ir lá e implementar.

Eu não tenho muito o que falar especificamente sobre o arquillian, porque minha utilização dele é extremamente simples e não tenho muita experiência com ele. Configuro para ele subir o servidor e me dar a url de deploy, para que eu possa fazer as requisições. Ele também tem ferramentas para fazer injeção de dependências dentro do teste, mas eu não utilizo essa parte.

Entendi! Bacana! Obrigado por compartilhar.