Testando Junit e Spring e Hibernate?

Galera, estou utilizando o Hibernate EntityManager com Spring 2, só que esotu injetando o entityManager direto na Action

Alguem está fazendo testes unitários utilizando esta arquitetura, Spring e Hibernate ?

Preciso de uma ajuda para testar meus Daos e Service…

Você não faz testes unitários nos DAOs diretamente usando JUnit.
Para testar operações com o banco de dados, você pode usar o DBUnit.

No caso dos services, você deve usar um MockObject para simular o papel do DAO. Aconselho o JMock ou EasyMock.

ManchesteR,

Com estes frame´s descritos eu consigo integração com o Spring e Hibernate, quero dizer, eu consigo simular a conexão como o Spring realiza ?

[quote=jonimca]ManchesteR,

Com estes frame´s descritos eu consigo integração com o Spring e Hibernate, quero dizer, eu consigo simular a conexão como o Spring realiza ?
[/quote]

Você não vai testar a injeção do componente (no seu caso o EntityManager) na Action. Esse é papel do Spring e ele já foi testado para isso.
O que você irá testar de fato são os métodos da sua Action, classe de serviço, dominio, etc.

Por exemplo: Você tem uma Action LOGIN e o Spring inject seu EntityManager através do método set.
Algo assim:

public class LoginAction() {
  EntityManager em;
  
  public String doLogin() {
  }
  //Aqui ocorre a injeção
  public void setEntityManager(EntityManager em) {
    this.em = em;
  }
}

O Seu objetivo é testar o método doLogin(). No JUnit, você cria a sua Action como uma classe normal e depois passa o EntityManager para o método set da Action

LoginAction login = new LoginAction(); //cria o objeto normalmente
EntityManager em = new EntityManager();
login.setEntityManager(em); //aqui você "injeta" manualmente o objeto
//--Aqui faz as regras dos testes

Perfeito, muito bom o exemplo, só mais uma dúvida

Desta maneira estarei testando a camada de servico ? e quanto ao Dao ?

[quote=jonimca]Perfeito, muito bom o exemplo, só mais uma dúvida

Desta maneira estarei testando a camada de servico ? e quanto ao Dao ?[/quote]

Se você quer testar os métodos do DAO ai você deverá usar outro mecanismo, aconselho dar um olhada no DBUnit.
Agora se você quer testar a interação entre o DAO e a camada de serviço por exemplo, ai você deve usar um MOckObject para simular o DAO.
Exemplo de uma camada de serviço que retorna todos os clientes:

public class CustomersService {

  private DAOCustomers dao;

  public void getCustomers() {
    //faz alguma coisa aqui
    //por exemplo, você tem um método getList() no DAO, que irá retornar uma List de clientes
    List<Customers> list = dao.getList();
    //faz mais alguma coisa aqui da regra de negocio
  }
 
  //esse método o Spring vai injetar seu DAO
  public void setDAOCustomers(DAOCustomers  dao) {
    this.dao = dao;
  }
}

Dentro do JUnit, irá existir um MockObject para simular o DAO e irá simular o retorno do método getList(), retornando uma quantidade de usuarios. Todo o processo é feito manualmente, ou seja, não existe conexão de fato com o banco de dados.

ManchesteR,

Obrigado pela ajuda, vou testar…

abs

ManchesteR,

Estou criando o teste mas me deparei com uma dúvida, sendo

Minha aplicação está funcionando dessa maneira.

Na camada Service o Spring injeta o Dao

Na camada do Dao o Spring injeta o EntityManager

Na camada do Struts, na action o Spring injeta o Service.

Entao, para eu testar a Action preciso passar os paramestros de mapping, form, request e responde ?

Eu consigo fazer isso ?

Struts 1? Se sim o buraco é mais embaixo.

Um dos grandes pecados do Struts 1 é o alto acoplamento (Uma Action é acoplada com seu ActionForm e com objetos do servidor, request e response).

Caso você queria testar um Action do Struts 1, você terá que procurar outro mecanismo, aconselho o Cactus. http://jakarta.apache.org/cactus/

Estou usando o Struts 1, realmente o acoplamento é alto.

Vou testar esta outra ferramenta…abs

Por que você não faz os testes na camada de serviço?
Testar componentes web é trabalhoso!

[]'s