terça-feira, 4 de dezembro de 2007

Passagem de parâmetros para método mockado

Bem,

quando você mocka uma classe, você deve informar, no método de teste, o que o método deve fazer, então, vejamos:

classeDao.expects(once()).method("getAlgumaCoisa").
with(eq(1), eq(true)).will(returnValue(obj));

Traduzindo:

A classeDao é um mock, e neste escopo (método de teste), ele será invocado 1 única vez (expects(once())), o método que será chamado é o getAlgumaCoisa (method("getAlgumaCoisa")), quando passar os parâmetros 1 e true (with(eq(1), eq(true))), retorne um Object obj (will(returnValue(obj))).

Simples, porém me deparei com uma situação bem estranha:

O método que eu estava testando, passava como parâmetro a data atual, e não o recebia como parâmetro. Bem, o problema é o fato do método instanciar um objeto e passar como parâmetro para outro método (que iremos mockar).

Vou simplificar com um exemplo:

Na classe classeManager

o metodo fazAlgo():

//faz um blablabla
classeDao.getAlgumaCoisa(new String[]{"1", "2"});
//faz o resto do blablabla

no meu test:

Estou testando a classe classeManager

o método testFazAlgo():

se eu fizer:

classeDao.expects(once()).method("getAlgumaCoisa").
with(eq(new String[]{"1", "2"})).will(returnValue(obj));

não vai funcionar, ele vai me dizer que o método nunca foi invocado.

Pra quem já estudou um pouco de O.O. já deve ter percebido, o objeto que instanciei na classe classeManager (classeDao.getAlgumaCoisa(new String[]{"1", "2"});) é diferente do instanciado na classe de testes (classeDao.expects(once()).method("getAlgumaCoisa").
with(eq(new String[]{"1", "2"})).will(returnValue(obj));).

Então a solução é:

classeDao.expects(once()).method("getAlgumaCoisa").
with(ANYTHING).will(returnValue(obj));

o que quer dizer:

Quando eu passar "Qualquer Coisa" (with(ANYTHING)) para o método getAlgumaCoisa, retorne o obj.

Importante lembrar que a quantidade de parâmetros deve ser igual a do método "de verdade".