Eu posso estar viajando no que vou dizer a seguir, mas depois de ler este tópico e outros (principalmente sobre testes unitários) minha cerebro está quase derretendo. :oops:
Uma action é o lugar onde devemos colocar a lógica de controle, então ela não deve realizar outras tarefas e por isso os seus teste unitários devem conter apenas teste de lógica.
[quote=saoj]
…Mas do resto eu acho que é pra fazer como essa action do webwork que eu postei… [/quote]
Essa action é simples, mas mesmo assim e se tivermos de fazer coisas com autenticar o usuário antes da requisição, verificando se ele tem permissão para aquela ação, ou registar aquela ação em um BD, como seria o teste? E nossa action não passaria a depender de outros DAOs? :shock:
Eu andei dando uma olhada no pattern Chain of Responsibility que pode ser facilmente implementado com essa biblioteca da Jakarta. Vejam um exemplo:
[code]public class GerenciarUsuario extends ActionSupport {
public String adicionaUsuario = "AdicionarUsuario";
public String adicionar() throws Throwable {
try {
Command chain = ChainFactory.getChain(adicionaUsuario);
ActionContext context = new ActionContext();
context.put("usuario", usuario);
if (chain.execute(context)) {
return ERROR;
}
return SUCESS;
} catch (Exception e) {
addError(getText(e.getMessage()));
return ERROR;
}
}
}[/code]
Onde podemos, na classe que irá implementar os testes unitários, redefinir a string da variável adicionarUsuario da action por algo do tipo “AdicionaUsuarioMock” (não consegui imaginar uma forma melhor de fazer isso :oops: ), facilitando a criação e a chamada da classe Mock que irá simular o comportamento da série de commands que teriamos que chamar.
Desta forma eu acredito que teremos uma maior reusabilidade dos objetos da camada do “Domínio de Negócios” e um baixo acoplamento entre eles e a action, através de classes que implementem o pattern Command e ficariam responsáveis por chamar os objetos. Além de facilitar imensamente a alteração (inclusive da ordem de chamada), inclusão e exclusão desses “commands”.
Outra coisa que me deixa com um :?: na cabeça. Os testes unitários devem testar a funcionalidade de uma classe específica, e por isso criamos essas classes Mocks para simular as funcionalidades das classes que ela depende. Agora se criassemos Mocks para os DAOs da action acima, como saberiamos que eles estariam acessando corretamente a informação? Tudo bem, quem é responsável por isso é o DAO e não a action. Mas e o DAO, se substituirmos o SGBD por uma classe Mock, como teremos certeza que o mapeamento XML (como no caso do Hibernate), ou as querys estão corretas. Não seria correto testar diretamente com o BD, como disse o Sérgio, ou isso seria testes de integração?
Estou cada vez mais fascinado por este novo mundo, cercado de patterns e testes por todos os lados
. Só que não consigo para de pensar se, por empolgação, não estou “matando mosca com tiro de canhão” :mrgreen: e fazendo mau uso desses padrões, quase como uma orverdose.
Será que vocês, gurus aqui do GUJ poderiam me dizer se pelo menos estou no caminho certo e conseguindo entender o que vocês estão dizendo aqui no Forum.
Abraços