MOCK - Problemas para fazer uma mock que repsonda no lugar do meu DB

Fala galera tudo bem?

Estou com um problema que é o seguinte, estou implementando uma interface para representar meu acesso a DADOS, quero ter um perfil de testes onde quem responda a esses dados seja uma MOCK, mas a principio nao estou enxergando como posso implementar essa mock em uma classe, pensei em usar o MOCKITO mas olhando a API o pessoal so usa pra teste com JUNIT como eu usaria sem ele.

AJUDAS e OPINIOES sao mto bem vindas

oi, vê se isso serve pra tu

Abraços.

Então na verfade eu quero testa a camada de negocio usando a MOCK pra isolar os testes do banco. Já pensei em fazer essa mock na na mão inserindo os valores de resposta do metodos como valores fixos para o retorno do metodo, porém estou procurando uma forma melhor =(

A ideia é essa mesmo. O mock do banco é pra retornar o que foi configurado/esperado e assim poder testar o negocio.
Algo do tipo: voce diz ao hibernate para retornar (new Cliente(“admin”,“admin”)) toda vez que for pesquisado um cliente. Assim voce pode testar o login por exemplo.

Entendi, cara nao achei muita documentacao se voce puder me ajudar eu queria algo do tipo…

Quando minha camada de negocios pedir o objeto pro meu DAO eu vo precisa de varios objetos diferentes mas da mesma classe para cobrirem varios cenarios.

isso eh possivel voce terial algum exemplo?

Muito obrigado

[quote=marcelinhonbs]Entendi, cara nao achei muita documentacao se voce puder me ajudar eu queria algo do tipo…

Quando minha camada de negocios pedir o objeto pro meu DAO eu vo precisa de varios objetos diferentes mas da mesma classe para cobrirem varios cenarios.

isso eh possivel voce terial algum exemplo?

Muito obrigado[/quote]

O mais simples é seria usar um framework de mock, como o mockitto, por exemplo.
Mas na mão , vc simplesmente pode criar uma classe anonima que implementa a interface do DAO e retorna os objetos que vc quiser.
Outra opção é implementar a interface do DAO com um List ou Map que contém os objetos que vc quer retornar. Esta opção é mais reutilizável, que a classe anonima.

Entao cara, eu procurei o Mockito mas eu so consegui usar ele com o JUNIT, como eu faço pra usar ele sem o JUNIT? Se eu conseguisse usar algo tipo o metodo WHEN seria show. Você teria pra me mostrar um exemplo da ultima ideia que voce falo, eu nao consegui entender como ficaria para o meu BO acessar esse DAO

Obrigado

[quote=marcelinhonbs]Entao cara, eu procurei o Mockito mas eu so consegui usar ele com o JUNIT, como eu faço pra usar ele sem o JUNIT? Se eu conseguisse usar algo tipo o metodo WHEN seria show. Você teria pra me mostrar um exemplo da ultima ideia que voce falo, eu nao consegui entender como ficaria para o meu BO acessar esse DAO

Obrigado[/quote]

Vc deve ter uma interface tipo ClienteDao e uma implementação XPTOClienteDAO.
Você pode criar uma HashClienteDAO que implementa ClienteDAO, mais ou menos assim

public  class HashClienteDao implements ClienteDAO {

     private Map<Integer, Cliente> clientes = new HashMap<Integer,Cliente>();

     // implementação de todos os métodos do DAO
    // alguns exemplos

     public Cliente findById(Integer id) {
          return clientes.get(id);
     }
   
    public List<Cliente> findAll(){
      return new ArrayList<Cliente>(clientes.values());
    }  

    // métodos especificos 

    public List<Cliente> findAllByUF(UF uf){
          
          List<Cliente> result = new ArrayList<Cliente>();

          for (Cliente c : clientes.values(){
                      if (c.getUd().equals(uf) ){
                                result.add(c);
                      }
           }

            return c;
     }

     public List<Cliente> findBonsClientes() {
             return Arrays.asList( findByID(9) , findByID(11) , findByID(15))

    } 
}

ou seja, vc faz todos os métodos que interessa usar o mapa interno para procurar o que precisa. Se for necessário vc pode escrever o método com lógica fixa como no ultimo método
Para preencher o mapa pode fazê-lo no construtor ou em algum outro ponto criando um método publico na classe ( não na interface) para poder adicionar os objetos.

O seu BO deve ter uma assinatura parecida com esta:


public class ClienteBO {

      ClienteDAO clienteDAO;

      public ClienteBO  ( ClienteDAO clienteDAO){
           this.clienteDAO = clienteDAO;
      }

}

Ela não depende da classe verdadeira que implementa a interface. Então é só configurar no seu testes para que seja usada a classe de teste e não a verdadeira. Algo assim


@Test
public void testClientesBons (){
      
       HashClienteDao clienteDao = new HashClienteDao ();

     clienteDao.addCliente ( new Cliente("Fransico" , 'SP"));
     clienteDao.addCliente ( new Cliente("Maria" , 'RJ"));
      // etc ... 
       ClienteBO bo = new ClienteBO (clienteDao);

  bo.fazAlgumaCoisaComClientesBons();
}

Cara isso ae que eu precisava, vou utilizar o MAP. Muito obrigado a todos abcs