A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

TDD usual abordagem normal é BOTTOM-UP não é necessário nenhum projeto anterior.

Apresentações semelhantes


Apresentação em tema: "TDD usual abordagem normal é BOTTOM-UP não é necessário nenhum projeto anterior."— Transcrição da apresentação:

1 TDD usual abordagem normal é BOTTOM-UP não é necessário nenhum projeto anterior

2 Mocks Técnica usada por alguns grupos em TDD Favorece o uso de uma abordagem TOP- DOWN ao invés do BOTTOM-UP Deve-se ter em mente um esboço *básico* da arquitetura do sistema (mesmo que incompleta e que venha a mudar)

3 O que é um Mock? Mock é um objeto ”falsificado” Segue a mesma interface do objeto que ele quer falsificar Usuário do Mock não pode saber quando está usando um

4 Asserções em Mocks Asserções em Mocks são chamadas de Expectativas (expectations) As Expectativas são asserções a respeito: de quais métodos deve ser chamado do número de vezes que um método é invocado de qual o parâmetro que o método deve receber da ordem em que os métodos são invocados Também é possível expressar qual valor será retornado pelo método do Mock

5 Mocks X Stubs Stubs são parecidos com Mocks Também são um objeto falsificado Qual a diferença? Expectativas.

6 Como usar? Existe a classe A que se está testando Classe A depende da Classe B Para testar utilizando Mock: Crie um Mock da Classe B. Isto é, um objeto com mesma interface contendo expectativas. Intencie A e faça-o utilizar o Mock realize as operações sobre o objeto verifique que as expectativas foram obedecidas

7 Exemplo clássico: Observador/Observável public class TesteObservador { private final class ObservadorMock implements Observador { private boolean recebeuNotificacao = false; public void notificar() { recebeuNotificacao = true; } public boolean recebeuNotificacao() { return recebeuNotificacao; }... }

8 Exemplo clássico: Observador/Observável private Observavel observavel;... @Test public void observavelCadastradoÉNotificadoApósNotificacaoSerDisparada() { ObservadorMock o = new ObservadorMock(); observavel.cadastrarObservador(o); observavel.dispararNotificacao(); assertTrue(o.recebeuNotificacao()); }

9 Exemplo clássico: Observador/Observável @Test public void aoSerCadastradoObservadorNãoÉNotificado() { ObservadorMock o = new ObservadorMock(); observavel.cadastrarObservador(o); assertFalse(o.recebeuNotificacao()); }

10 Exemplo clássico: Observador/Observável @Test public void doisObservavelCadastradosSãoNotificadoApósNotificacaoSerDispar ada() { ObservadorMock o1 = new ObservadorMock(); ObservadorMock o2 = new ObservadorMock(); observavel.cadastrarObservador(o1); observavel.cadastrarObservador(o2); observavel.dispararNotificacao(); assertTrue(o1.recebeuNotificacao()); assertTrue(o2.recebeuNotificacao()); }

11 Exemplo clássico: Observador/Observável public class Observavel { private List observadores = new ArrayList (); public void cadastrarObservador(Observador o) { observadores.add(o); } public void dispararNotificacao() { for (Observador o : observadores) o.notificar(); }

12 Vantagens Foca-se apenas na classe que está sendo testada Fácil gerar exceções ou comportamentos de difícil ocorrência em um objeto real Pode acelerar os testes Mock pode substituir um objeto que acessa disco, faz consultas a bancos de dados, ou qualquer outra tarefa lenta

13 Desvantagens Modificação na interface pública pode causar inconsistências pode causar falhas mesmo que erros não existam Pode tornar código de teste mais difícil de manter Acarreta complexidade Como fazer com que o Mock seja utilizado pelo objeto? Bugs na integração de duas ou mais classes se tornam mais comuns

14 Como fazer em Java Não é necessário criar Mocks ”na mão” Java possui diversas bibliotecas de para a criação de Mocks, ex: Jmock (www.jmock.org) Easy Mock Curiosidade: feito utilizando Reflexão e Instrumentação de bytecode Chamados de Dynamic Mocks

15 Mesmo exemplo usando JMock @RunWith(JMock.class) public class TesteObservador { private Mockery context = new JUnit4Mockery(); private Observavel observavel; @Before public void criarObservavel() { observavel = new Observavel(); }... }

16 Mesmo exemplo usando JMock @Test public void observavelCadastradoÉNotificadoApósNotificacaoSerDisparada() { final Observador o = context.mock(Observador.class); observavel.cadastrarObservador(o); context.checking(new Expectations() {{ one (o).notificar(); }}); observavel.dispararNotificacao(); }

17 Mesmo exemplo usando JMock @Test public void aoSerCadastradoObservadorNãoÉNotificado() { final Observador o = context.mock(Observador.class); context.checking(new Expectations() {{ never(o).notificar(); }}); observavel.cadastrarObservador(o); }

18 Mesmo exemplo usando JMock @Test public void doisObservavelCadastradosSãoNotificadoApósNotificacaoSerDisparada() { final Observador o1 = context.mock(Observador.class); final Observador o2 = context.mock(Observador.class); observavel.cadastrarObservador(o1); observavel.cadastrarObservador(o2); context.checking(new Expectations() {{ one(o1).notificar(); one(o2).notificar(); }}); observavel.dispararNotificacao(); }

19 Maiores detalhes sobre JMock JMock é uma DSL (Domain Specific Language) para a criação de mocks Há como especificar: retornos ordem número de vezes que um método será invocado etc. http://www.jmock.org/cookbook.html


Carregar ppt "TDD usual abordagem normal é BOTTOM-UP não é necessário nenhum projeto anterior."

Apresentações semelhantes


Anúncios Google