Estou fazendo dois trabalhos atualmente: sobre Mock Objects (como preparatório para Service Simulation, se tudo der certo) e sobre WSS. Por isso, e também para receber alguns inputs (que seriam muito bem vindos) vou postar algumas coisas da minha pesquisa aqui no blog. E nesse post explico o que são Mock Objects.
Mock Objects são objetos que simulam outros objetos. São principalmente usados em testes de unidade. Existem vários frameworks de Mock Objects mas pessoalmente prefiro o jMock. Abaixo mostro um exemplo de um teste de unidade usando-se TestNG 5.9 e jMock 2.5:
public class PublisherTest { private Mockery context = new Mockery(); public PublisherTest() { context = new Mockery(); // para podermos mockar uma classe context.setImposteriser(ClassImposteriser.INSTANCE); } @Test public void testOneSubscriberReceivesAMessage() { // configura mock Subscriber subscriber = context.mock(Subscriber.class); Expectations expect = new Expectations(); String message = "message"; // configura estado do objeto Publisher publisher = new Publisher(); publisher.add(subscriber); // expectativas expect.never(subscriber).receive(message); context.checking(expect); // executa publisher.publish(message); // verifica context.assertIsSatisfied(); } }
Usamos mocks em cenários onde precisamos testar um objeto que depende de outros. Qual o problema de dependências? O objetivo dos testes de unidade é testar objetos em isolado, mas se usássemos um Subscriber real erros nele poderiam fazer falhar o teste do Publisher (ver figura abaixo). Por isso usamos mocks.
![]() Teste usando-se objetos reais |
![]() Teste usando-se mocks |
Com mocks podemos não só substituir algum objeto, mas também controlar todas as interações que são feitas com ele: verificar chamadas de métodos, valores de parâmetros, definir valores de retorno, etc. No código acima estamos por exemplo esperando uma chamada ao método receive do subscriber.
Dito o objetivo que motivou a criação dessa técnica, existem outros que vieram a ser supridos por mocks:
- Abstrair camadas mais baixas do sistema, tanto por elas não estarem prontas quanto por querermos trabalhar offline.
- Centralizar a configuração de estado no próprio mock ao invés de espalhá-las pelos testes de unidade.
- Simular condições difíceis de reproduzir, como o lançamento de uma excessão mais esdrúxula ou um valor retorno raro.
- Verificar mais rapidamente quando um erro ocorre (fail fast), indicando em que passo do comportamento esperado foi errado ao invés de apenas dizer que o estado final do objeto não condiz com o esperado.
Algo muito interessante vindo do uso de mocks é o Need-Driven Development (NDD), mas não pretendo falar dele aqui. Quando sair meu trabalho disponibilizo no blog, mas quem tiver curiosidade pode me escrever, é sempre bom trocar idéias


