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