demoiselle / framework

Repositório principal contendo o Core e Extensions: JPA, Security, WS
https://demoiselle.org
127 stars 77 forks source link

Exemplos de Teste Unitários com Java EE 7 e Demoiselle 3 #82

Open jimycoelho opened 7 years ago

jimycoelho commented 7 years ago

Estamos implementando um projeto no SERPRO com Java EE 7 usando Demoiselle 3. Construímos o projeto segundo o roteiro: https://demoiselle.gitbooks.io/documentacao-jee/content/roteiro_rapido.html e usamos o wildfly-10.1.0.Final.

E temos a seguinte estrutura

@ApplicationScoped @Path("tipo-unidade") public class TipoUnidadeRest {

@Inject
private TipoUnidadeBC bc;

...

}

public class TipoUnidadeBCImpl extends AbstractBusiness<TipoUnidade, Integer> implements TipoUnidadeBC {

@Inject
private TipoUnidadeDAO dao;

....

}

public class TipoUnidadeDAOImpl extends AbstractDAO<TipoUnidade, Integer> implements TipoUnidadeDAO {

@PersistenceContext(unitName = "sgu")
private EntityManager em;

...

}

E tudo está funcionando perfeitamente, mas estou com dificuldade em fazer testes unitários. Eu gostaria de fazer os seguintes testes: teste conectando na base, teste mockando o DAO e teste de beans validation. Dos exemplos disponibilizados não encontrei nada que atendesse as minhas necessidades. O que encontrei na internet é o uso do demoiselle-junit para Demoiselle 2, mas que não funcionou no Demoiselle 3. Para teste conectado encontrei isso: http://www.devmedia.com.br/testes-de-integracao-utilizando-cdi-jpa-e-ejb-e-arquillian/33340 Que além de demorado pois tem que subir o container, também passa a não funcionar quando estendemos as classes do Demoiselle.

Gostaria que disponibilizassem exemplos de testes unitários de beans validations, que conectam na base e que fazem mock do DAO usando Demoiselle 3. Uma sugestão é incrementar os exemplos disponibilizados para contemplar os testes unitários requeridos.

mestihudson commented 7 years ago

Penso que os testes conectados à base (testes de integração), não tem jeito, são realmente mais complicados, mais lentos e inclusive sujeitos a particularidades das tecnologias envolvidas (em produção usam um mecanismo diferente, que pode ser, precariamente, simulado com Arquillian - desconheço quem os utiliza além dos exemplos 'happiness path' existentes no site da ferramenta, mas confesso que não passa de ignorância minha e não tenho amostra suficiente para fazer afirmações mais agressivas).

No entanto, no quesito testes unitários podem (e "devem", se incluírem computação, o que excluí classes tais como VO/DTOs e Delegates/Facades) ser realizados (o que inclui qualquer objeto que não chegue a borda da aplicação, acessando suas dependências externas - banco, http, ldap, jms, email, etc). Mock é só um dos mecanismos de Test Double que existem, mas são os mais populares.

A exemplo do que você citou, por exemplo, é possível testar o BC usando Mockito (http://blog.caelum.com.br/facilitando-seus-testes-de-unidade-no-java-um-pouco-de-mockito/) para injetar os DAOs, e outras dependências marcadas com @Inject, para testar de forma isolada esse tipo de objeto, onde geralmente está a inteligência do sistema.