É aceitavel que os testes interfiram no design do código?

5 respostas
M

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:

public class MinhaAction extends BaseAction {
  private ClienteRepositorio clienteRepositorio;

  public String execute() {
    ...
  }
}
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?

5 Respostas

ViniGodoy

Por que não usa os recursos de injeção de dependencia do menta para injetar o mock durante os testes?

Rubem_Azenha

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).

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

Jair_Rillo_Junior

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ê.

J

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

+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

Criado 19 de agosto de 2009
Ultima resposta 21 de ago. de 2009
Respostas 5
Participantes 6