Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Teste JUnit - CDI + EJB + JPA + Maven

Olá, tenho uma aplicação JSF, utilizando o JPA + EJB + CDI com pool gerenciado pelo wildfly.

Gostaria de fazer os testes com JUnit, no entanto já tentei varias alternativas, mas não achei nada que seja satisfatório.

Usando a implementação WeldJunit4Runner não consigo injetar um bean ViewScoped pois apresenta um erro com essa mensagem Weld SE container STATIC_INSTANCE shut down by shutdown hook.

Usando a implementação JUnit 5 o bean não é injetado, sempre traz null.

Usando o Arquillian quando injeto o bean, o ShrinkWrap pede para adicionar varias classes que não tem fim, eu executo ele pede pra adicionar uma classe dependente, executo novamente pede pra adicionar outra, praticamente eu tenho que adicionar o projeto inteiro. Quando adiciono o pacote inteiro, ele apresenta erro pois existem abstrações, e conforme o manual as classes extendidas ou implementadas não devem ser adicionadas, somente a classe principal.

Alguém tem alguma alternativa para que possa ter a injeção de dependencias com JPA no teste com junit? Eu já estava criando construtores para resolver as dependencias manualmente, no entanto isso é muito trabalhoso.

Se alguem tiver alguma alternativa, já trabalhou com isso e tiver um projeto que possa postar para que eu possa me basear em algum conteúdo para testar, agradeço.

9 respostas

Duvida também postada no guj. http://www.guj.com.br/t/teste-junit-cdi-ejb-jpa-maven/378415

Seu projeto está em algum repositório git pra gente dar uma analisada?

Posso te dar acesso no caso, só preciso que me passe algum whatsapp pra gente conversar.

Melhor é conversar por aqui pois me dá XP por resolver os tópicos rsrsrs. Tem o Mockito dá uma olhada http://blog.caelum.com.br/facilitando-seus-testes-de-unidade-no-java-um-pouco-de-mockito/ .

Já te adianto que não manjo muito de Java sou mais .NET mas se tiver dúvidas to aqui pra pesquisar e te ajudar no assunto.

solução!

Oi Rafael,

Tenho um repositorio no meu GitHub de um projeto em Java EE 7 que utiliza testes automatizados: https://github.com/rcaneppele/folhadepagamento

Mas resumindo: para você não ter dificuldades na escrita dos testes e poder testar tudo com testes de unidades simples, a ideia é extrair as lógicas de negócio(validacoes, calculos, etc.) para classes simples, ao inves de deixar nos ManagedBean's ou EJB's, pois assim você consegue testar com testes de unidade e utilzar mocks quando fizer sentido.

Desse jeito não precisará quebrar a cabeça com Injeção de dependências, servidor, arquillian, etc.

Veja se no seu caso seria possível ter uma arquitetura mais simples, como essa do projeto de exemplo, para facilitar a escrita dos testes automatizados.

Oi Rafael,

no nosso curso sobre Integração Continua usamos uma Java Web App e nela tem um exemplo com Arquillian, no entanto com Tomcat e sem EJB. Talvez ajude tbm:

https://github.com/alura-cursos/argentum-web

abs

Certo.

Conforme a informação que passaram vou buscar criar uma solução, e tendo a resposta voltarei a evoluir o tópico marcando a solução.

E se puder, compartilhe com a gente :)

Só para compartilhar a resposta. Nós utilizamos no nosso projeto a ideia de mocks e databuilders.

As dependencias de configurações, e todas dependencias que eram necessárias para execução de algum método na view, mockamos eles na classe e utilizamos os databuilders para trazer o retorno desses mocks.

//Passa a classe para ser mockada
@Mock
 private Configuracao configuracao;

//Seta dentro da visualização a classe mockada
view.setConfiguracao(configuracao);

//Antes de utilizar o método a ser testado, é repassado o método que retorna o objeto criado no DataBuilder,
//(que é apenas um object criado que deveria retornar no banco).
 Mockito.when(configuracao.getMoedaPadrao()).thenReturn(moedaDB.getGuarani1());

Isso resolve basicamente todos os problemas. Att.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software