quinta-feira, 10 de janeiro de 2008

Testando Actions do WebWork 2

No site da opensymphony tem um artigo mostrando como Testar Actions do WW, como não entendi direito, pedi um auxílio ao Igo Coelho e vi que o negócio é mais simples do que parece.

Para testar Actions, não precisamos estender nada, porém temos que ficar atentos com as variáveis da classe, pois essas terão que ser informadas.

1) Pra começar, crie uma instancia da Action a ser testada:

private ArtigoEditAction action;

é essa variável que será utilizada para invocar os métodos, como também, setar as variáveis da Action.

2) setUp e tearDown pra deixar as coisas nos seus lugares:
 0: protected void setUp() throws Exception
1: {
2: super.setUp();
3: action = new ArtigoEditAction();
4: }
5:
6: protected void tearDown() throws Exception
7: {
8: action = null;
9: super.tearDown();
10: }
3) A grande maioria desses testes consiste apenas em verificar o direcionamento:
0: public void testExecute() throws Exception
1: {
2: assertEquals(action.execute(), "success");
3: }
4) Como as Actions não retornam os objetos que usaremos nas páginas, eles são populados e passados por request (eu acho), é importante verificar o estado da variável:

para o método:
0: public String listNormas() throws Exception
1: {
2: artigo = artigoManager.findById(artigo.getId());
3: return Action.SUCCESS;
4: }
a variável artigo é alterada, então não devemos testar somente o retorno, devemos testar também o estado dessa variável após o método ser executado:
 0: public void testList() throws Exception
1: {
2: Artigo artigo = new Artigo();
3: artigo.setId(1L);
4:
5: Artigo artigoCheio = new Artigo();
6: artigoCheio.setId(1L);
7: artigoCheio.setResumo("resumo");
8:
9: action.setArtigo(artigo);
10:
11: artigoManager.expects(once()).method("findById").
12: with(eq(artigo.getId())).will(returnValue(artigoCheio));
13:
14: assertEquals(action.getArtigo().getResumo(), null);
15: assertEquals(action.listNormas(), "success");
16: assertEquals(action.getArtigo().getResumo(), "resumo");
17: }
5) Para efeito de 100% de cobertura, eventualmente você terá que forçar umas chamadas de get ou set de alguma propriedade, pois é bem possível que esta não seja invocada naturalmente:
* Um plugin como o eclEmma pode te ajudar muito nessas horas.
 0: public void testCobrirGetsSets()
1: {
2: Collection vendedores = new ArrayList();
3: action.setVendedores(vendedores);
4: action.getDataFinalVendas();
5: action.getProdutoPacotes();
6: action.getProdutoPacote();
7: action.getDataInicioVendas();
8: action.getVendedor();
9: }
* sei que é horrível, mas é melhor um teste feio do que não ter o teste.


Só isso, fácil fazer teste para as Actions, né!? :P Se encontrar alguma dificuldade postarei aqui, mas acabou a desculpa de não fazer testes nas Actions.