28.6.05

Mock objects

Imagine que vc queira criar testes unitários para uma classe Correio, que envia mensagens através de meios de envio especificados pela interface MeioEnvio. Vamos supor que as implementações disponíveis de MeioEnvio dependam de hardware para funcionar, como comunicação com um dispositivo externo, por exemplo.

Como testar a classe Correio isoladamente e sem escrever muito código? Veja no exemplo abaixo um caso de teste utilizando MockObjects.

public class Correio {

private MeioEnvio meio;

public Correio(MeioEnvio meio) {
this.meio = meio;
}

public boolean enviar(String mensagem) {
return (meio.enviar(mensagem) == mensagem.length());
}
}

public interface MeioEnvio {
public int enviar(String mensagem);
}

public class Teste extends TestCase {

public void testEnvio() throws Exception {
final String mensagem = "Macarrão";
Mock meio = new Mock(MeioEnvio.class); //1
Correio corr = new Correio((MeioEnvio) meio.proxy()); //2
meio.expectAndReturn("enviar", mensagem,
mensagem.length()); //3
assertTrue(corr.enviar(mensagem));
meio.verify();//4
}
}

A classe Mock gera uma implementação "falsa" de nossa interface (1), que é passada como parâmetro ao construtor (2).

Devemos então informar ao nosso objeto "falso" o que fazer. Nesse caso, dizemos a ele para aguardar uma chamada ao método enviar, com a string mensagem como parâmetro e retornar o comprimento de mensagem (3).

Por fim, pedimos ao objeto para verificar se as chamadas realizadas foram feitas da maneira correta (4).

Maiores informações podem ser obtidas em Mock Objects.

Veja também este guia de como portar testes da versão 0.08 para a versão 0.09.

Nenhum comentário: