
e testes, sobretudo através do uso de testes de unidade. Mas estes testes, embora sejam bastante úteis para manter a boa saúde de um software, freqüentemente são difíceis de serem criados.
Testes de unidade procuram testar classes isoladamente. Classes em um sistema normalmente alcançam seus objetivos com a ajuda de outras classes; não funcionam isoladamente, freqüentemente se comunicando com outros elementos da aplicação. Quando construímos um teste de unidade, um dos principais desafios é exatamente isolar a classe sendo testada, para que nenhuma outra seja envolvida no teste. Para compreender o problema, vejamos um pequeno exemplo.
Exemplo de dificuldade para testar classes isoladamente
Imagine que estivéssemos desenvolvendo um software para automatizar as operações de um restaurante. Entre as muitas funcionalidades desse sistema, uma essencial seria a geração da conta. Uma conta típica tem muitas características, mas iremos nos preocupar apenas com a mais importante: o total a ser pago. Como exemplo, iremos implementar um teste para validar se o total da conta está sendo calculado corretamente.
Nossa classe Conta foi modelada de acordo com o diagrama apresentado na Figura 1.

Figura 1. Classes usadas para modelar uma conta.
A impressão de uma conta, como pode ser observado na Figura 2, é composta por linhas, onde cada linha indica um item, sua quantidade, e o preço total (quantidade de itens da linha multiplicada pelo preço unitário do item). Um item, por sua vez, possui um nome e um preço unitário. Na parte inferior da impressão da conta é apresentado o valor total a ser pago, que é, como esperado, o somatório do total de cada linha.

Figura 2. Exemplo de impressão de conta.
Na Listagem 1, você encontrará o teste criado, bem como a respectiva classe Conta, cujo método total() desejamos testar. Note que as outras duas classes modeladas precisaram ser usadas durante a criação do teste: LinhaItem e Item. Isso tornou o método de teste maior, mais complexo e mais demorado de ser implementado. Além disso, essa forma de confeccionar o teste faz com que não seja verdadeiramente um teste de unidade, pois a classe Conta não está sendo testada isoladamente. Se o teste deixa de funcionar devido a uma falha no código, isso pode ter sido causado por uma falha na classe Conta, ou mesmo em LinhaItem ou Item.
Listagem 1. Teste da conta sem usar mock objects.
Classe TestCase
import junit.framework.TestCase;
public class ContaTeste extends TestCase {
public void testTotalNota() {
Conta conta = new Conta();
Item lasanha = new Item();
lasanha.setNome("Lasanha a Bolognesa");
lasanha.setPreco(10);
Item refrigerante = new Item();
refrigerante.setNome("Guarana");
refrigerante.setPreco(1);
Item sorvete = new Item();
sorvete.setNome("Sorvete de Chocolate");
sorvete.setPreco(4);
...