Estou desenvolvendo uma aplicação web usando Mentawai…
Preciso escrever testes para uma Action que possui alguns atributos privados que são instancias dos meus repositorios…
ex:
[code]public class MinhaAction extends BaseAction {
private ClienteRepositorio clienteRepositorio;
public String execute() {
…
}
}[/code]
Em produção, posso usar o recurso de injeção de dependencias do menta para instanciar o repositorio e colocar na minha variável de instancia clienteRepositorio.
Mas em ambiente de testes, preciso colocar ali um “mock” do repositório. Pensei em em aumentar a visibilidade da variável (package ou protected), e no teste eu coloco algo ali manualmente… Ex:
@Test
public void testExecute() {
MinhaAction action = new MinhaAction();
action.clienteRepositorio = new MockClienteRepositorio();
}
Aí vem minha dúvida: Eu faria essa mudança meramente para viabilizar os testes. Isso deveria ser evitado, na opinião de vcs?
Recomendam alguma outra alternativa?
Por que não usa os recursos de injeção de dependencia do menta para injetar o mock durante os testes?
Por que infelizmente não é tão simples assim usar os recursos de injeção de dependência do menta fora de forma “standalone”.
O jeito é criar um setter (não é muito legal, mas ninguém vai morrer por causa disso).
É aceitável sim.
O argumento que eu sempre uso quando me fazem essa pergunta é: Para testar, o código precisa estar desacoplado (usar DI etc). Se ele não está desacoplado, fica difícil de testar, portanto, se você não consegue fazer o teste, significa que seu código precisa de um refactoring.
TDD ajuda muito nesse ponto, pois se você escreve seu teste primeiro, obrigatóriamente vai estar escrevendo código testável.
[]s
Você pode “injetar” como o Rubens disse, criando um método set e no seu teste unitário injetando o mock por ele. Eu particularmente uso muito esse approach.
Outra solução (porém na minha opinião é pior) é criar uma Factory para te retornar esse Repositório, assim, no seus testes, quando a Action chamar a Factory, ela retorna o Mock para você.
[quote=Ferryman]É aceitável sim.
O argumento que eu sempre uso quando me fazem essa pergunta é: Para testar, o código precisa estar desacoplado (usar DI etc). Se ele não está desacoplado, fica difícil de testar, portanto, se você não consegue fazer o teste, significa que seu código precisa de um refactoring.
TDD ajuda muito nesse ponto, pois se você escreve seu teste primeiro, obrigatóriamente vai estar escrevendo código testável.
[]s[/quote]
+1
Eu sou mais enfático: o termo “aceitável” passa a idéia de que vc está fazendo algo que geralmente
é errado mas que pode ser relevado em certos casos.
Para mim, o design deve necessariamente incluir ganchos para o teste ser feito de maneira simples
e eficaz.
Não é apenas aceitável, é fundamental.
[]s
Jorge Diz