Boa noite pessoal,
Estou implementando o JUnit (já tava demorando... :lol: ) e agora estou com problema para fazer isso com os EJB's do projeto. Já dei uma googleada, achei algumas coisas, mas estou um pouco perdido.
O que e como vocês geralmente usam para testar seus EJB's???
ejb 3 tem - http://ejb3unit.sourceforge.net/
e o 2 tem tb o cactus…
Como uso EJB3 mesmo, da pra testar bem com junit… teste pra simular um container acho bem raro… no caso do JBoss da pra subir um Microkernel tb, mas nunca fiz…
Estou implementando o JUnit (já tava demorando... :lol: ) e agora estou com problema para fazer isso com os EJB's do projeto. Já dei uma googleada, achei algumas coisas, mas estou um pouco perdido.
O que e como vocês geralmente usam para testar seus EJB's???
Obrigado, abraçoos[/quote]
Qual versão de EJB que você usa e qual(is) problemas você encontrou?
Na empresa nós usamos EJB3, e só o JUnit nos tem sido suficiente para nossos testes, juntamente com o EasyMock(prefiro o Mockito, mas a empresa usa esse) para mockar as classes auxiliares. As classes que são injetadas via container, nós normalmente fazemos uma implementação de get/set delas, e por eles setamos a classe mockada.
Estou implementando o JUnit (já tava demorando... :lol: ) e agora estou com problema para fazer isso com os EJB's do projeto. Já dei uma googleada, achei algumas coisas, mas estou um pouco perdido.
O que e como vocês geralmente usam para testar seus EJB's???
Obrigado, abraçoos[/quote]
Qual versão de EJB que você usa e qual(is) problemas você encontrou?
Na empresa nós usamos EJB3, e só o JUnit nos tem sido suficiente para nossos testes, juntamente com o EasyMock(prefiro o Mockito, mas a empresa usa esse) para mockar as classes auxiliares. As classes que são injetadas via container, nós normalmente fazemos uma implementação de get/set delas, e por eles setamos a classe mockada.
[]'s[/quote]
Estamos usando EJB3 com JBoss. Até tentei usar apenas o JUnit, mas tive problemas com a injeção de dependencia. Estou tentando adotar o pattern ServiceLocator, mas tudo que consegui foi uma mensagem de not bound. Tentei também com o cactus, mas não consegui usar também, tenho sentido muita falta de documentação em português para estas opções, talvez por isso eu esteja apanhando tanto. Já li sobre o EasyMock, mas não tentei Mockar o EJB. Eu teria que fazer alguma configuração específica para Mockar meu EJB?
[quote=ffranceschi]ejb 3 tem - http://ejb3unit.sourceforge.net/
e o 2 tem tb o cactus…
Como uso EJB3 mesmo, da pra testar bem com junit… teste pra simular um container acho bem raro… no caso do JBoss da pra subir um Microkernel tb, mas nunca fiz…[/quote]
Eu acho que seu problema não é simplesmente como testar EJB, mas sim o conceito dos testes unitários.
Como o próprio nome diz, teste unitário vai testar apenas a unidade. Se a unidade depende de outras classes (seja EJB, DAO, POJO, whatever) você deve usar um mock. Portanto, seu componente EJB deve ser totalmente independente (no final das contas ele acaba se tornando uma classe Java normal que não precisa do container).
Assim sendo, aconselho você dar um olhada com carinho no EasyMock ou JMOck (eu prefiro o segundo, mas no projeto que estou trabalhando atualmente estou usando o EasyMock).
Para fazer a injeção dos MOCKs, você pode usar métodos SET.
Agora caso você queira fazer um teste de integração, ai eu aconselho o Cactus (estou usando a um tempo e recomendo).
No meu caso aqui, estou escrevendo os teste unitários do próprio EJB. Minha primeira tentativa realmente foi testá-los como classes java comuns mas esbarrei no problema da injeção de dependencia da Session do Hibernate, por isso resolvi tratá-los como EJB's que são e aí veio os problemas com o container.
Você teria um exemplo usando mocks para fazer a injeção de dependencia?
Você quer injetar a session do hibernate ou o DAO?
Porque se for o DAO, você pode mocka-lo sem problema. Agora se você quer injetar a Session do Hibernate e dentro do seu EJB manipular o banco, ai você não estará fazendo um teste unitário e sim um teste de integração (integrando a aplicação ao banco).
Mesmo nesse caso, você pode fazer o teste fora do container, mas como? No seu teste unitário, inicia uma Session do Hibernate e injeta ela no seu EJB (através de set ou pelo construtor). Alias, eu faço isso aqui
Sobre exemplo de MOCK, no próprio site do EasyMock ou JMOck tem. Eu acho, que no meu blog tem algo a respeito (link no rodapé).
Quanto ao teste de integração, tenho que confessar que esta diferença entre os conceitos de unitário e integração eu não tinha. Vou dar uma lida a respeito.
Talvez seja interessante você separar o seu EJB da camada de acesso ao banco, através do padrão DAO. Assim, dentro do SessionBean você pode construir o DAO através de um Factory Method e para testes unitários você poderia injetá-lo usando um setDAO.
A vantagem é que você pode fazer o mock do DAO e, de fato, fazer o teste unitário da sua camada de EJB.
Essa é a arquitetura que eu uso no meu projeto atual. Seria mais ou menos assim
Session Bean, com o Factory Method para retornar o DAO
@Stateless
public class SessionBeanQualquer implements MinhaInterfaceQualquer {
private DAO meuDAO; //Interface do DAO
//recupera o dao através de um Factory Method
public DAO getDAO(String parametro) {
if (meuDAO == null) { //ou seja, eu não tenho o DAO, vamos cria-lo
meuDAO = DAOFactory.getDao(Parametro); //Cria o DAO pela fábrica
return meuDAO;
} else {
return this.meuDAO;
}
}
//método set para injetar o DAO nos testes unitario.
public void setDAO(DAO dao) {
this.meuDAO = dao;
}
//método qualquer do sessionBean
public List<AlgumObjetoPOJO> fazAlgumaCoisa(Long idAlgumaCoisa) {
//Supondo que você queria uma Lista de AlgumaCoisa
List<blablabla> getDAO.getListBLABLABLABLA(idAlgumaCoisa); //nao chamo o DAO diretamente, mas sim o factory method
//continua as operações aqui
}
}
Note que na criação do DAO, a gente testa se ele já foi previamente criado ou não. Use uma Factory para evitar acoplamento
Agora na classe do Junit, simplesmente faça um Mock da interface DAO. Pode injetá-la através do set
public class TestSessionBeanQualquer.....{
//Cria o Mock
//Adiciona a expectativa
public void testBuscaBlablabla() {
meuSessionBean.setDAO(mock);
meySessionBean.fazAlgumaCoisa....
}
}
Não sei se ficou claro, mas a idéia é mais ou menos assim.
To procurando pra caramba na net como injetar um mock de dao ou de ejb sem ter que adicionar os métodos set deles.
encontrei numa página que se pode colocar num xml e ele adiciona, mas por reflection pra mim seria melhor…