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

EntityManager e Session - Teste

Bom dia Maurício,

Primeiramente, gostaria de agradecê-lo pelos ótimos treinamentos, eles me ajudaram bastante! Trabalhei em um projeto uma vez que eu usava o EntityManager. Tentei fazer o teste passando o EntityManager no construtor, como foi demostrado na Session e funcionou conforme esperado, mas minha dúvida é a seguinte: No vídeo foi mostrado que a session era finalizada no ambiente de teste, mas não deveríamos encerrar a session no método da classe testada? Pois no meu entendimento, se você fecha a session somente no teste, quando o código for para produção a classe com o método testado ficaria com a Session em aberto quando for chamado. Tentei no meu caso, colocar o manager.close() no método salvar, mas como esperado, quando ia invocar o método para listar, o EntityManager já havia sido fechado (no método salvar) e ele lançava uma exception.

Não sei se minha pergunta ficou clara, caso não tenha ficado, vou tentar explicar de outra forma.

Obrigado pela atenção!

5 respostas

Ola, Rafael !

É interessante deixar o ambiente se responsabilizar por encerrar qualquer recurso que esta sendo usado, dessa forma não precisamos nos preocupar com essa tarefa. Lembre-se ambiente de Teste e ambiente de Produção são coisas diferentes, no caso, cada ambiente cuidará dos seus recursos. Por isso no vídeo esta sendo encerrado no ambiente.

Ajudei ?

Abraços!

Oi Rafael, tudo bem?

Eu concordo com o Cristiano, um dos grandes baratos da injeção de dependências é delegar a responsabilidade de lidar com o ciclo de vida dos recursos pra alguém especialista em fazer isso.

Lembrando que há várias ferramentas que se integram com containers de DI pra ajudar nos testes de integração, como o módulo Spring Test ou o Arquillian para Java EE.

Abraços!

Olá Cristiano e Leonardo,

Agradeço pelo rápido retorno e explicações, com certeza ajudaram.

Leonardo, aproveitando o gancho, no caso se eu utilizasse CDI, como eu resolveria esse cenário? Eu teria uma classe para retornar a EntityManager (ex: JPAUtil com o @Produces e @Disposes) e faria a injeção da EntityManager somente na classe testada e abriria a transação na classe de teste?

Obrigado!

Abraços

solução!

Oi Rafael, tudo bem? :)

Eu usaria os interceptors do CDI pra abrirem a transação. Se você usa Java EE 7 pode usar também a anotação @Transactional.

Abraços!

Obrigado Leonardo!

Abraços