<ul>Já que vai fingir, finja direito Testando com Mocks  </ul><ul><li>Lucas Cavalcanti @lucascs Rafael Ferreira @rafaeldff...
<ul>Testes unitários </ul>
<ul>Seu código é testável? </ul>public   class  Programa { public   static   void  executa() { BancoDeDados bd =  new  Ban...
<ul>Injeção de dependências </ul>
<ul>Código mais testável </ul>public   class  Mecanico { public  Mecanico(ChaveDeFenda fenda, ChaveInglesa inglesa, Calend...
<ul>Teste #comofas </ul>
<ul>Como criar um Mecanico? </ul>ChaveDeFenda fenda =  vaiNaCaixaEBuscaAChaveDeFenda (); ChaveInglesa inglesa =  vaiNaCaix...
<ul>Mocks </ul>
<ul>Como criar um Mecanico? </ul>ChaveDeFenda fenda =  mock ( ChaveDeFenda.class ); ChaveInglesa inglesa =  mock ( ChaveIn...
<ul>Test Smells </ul><ul>Quando seu teste diz que há algo de errado </ul>
<ul>Nomes ruins </ul>public   class  LancadorTest { public   void  testDispara() { // coisas complicadas } }
<ul>Nomes ruins </ul>public   class  LancadorTest { public   void  disparaMisseisQuandoUmAtaqueNuclearForDetectado(){ // c...
<ul>Testes muito grandes </ul>public   void  testEnaganaOCliente() { Parafuseta parafuseta =  new  Parafuseta( new  Estepe...
<ul>Testes muito grandes </ul>public   void  testEnganaOCliente() { Cliente cliente = mockery.mock(Cliente. class ); esper...
<ul>Muitas dependências </ul>public   void  disparaMisseisNuclearesQuandoAtaqueForDetectado() { DetectorAereo detectorAere...
<ul>Muitas dependências </ul>public   void  disparaMisseisNuclearesQuandoAtaqueForDetectado() { DetectorDeAtaque detectorD...
<ul>Dependências escondidas </ul>public   class  Pedido { private   static   final   int   TRES_HORAS  = 3*60*60*1000; pri...
<ul>Dependências escondidas </ul>public   class  Pedido { private   final  Date  dataDeCriacao ; public  Pedido(Relogio re...
<ul>Testes frágeis </ul>@Test public   void  enviaEmailDeSenha() { Usuario usuario =  new  Usuario(); mockery.checking( ne...
<ul>Testes frágeis </ul>@Test public   void  enviaEmailDeSenha() { Usuario usuario =  new  Usuario(); mockery.checking( ne...
<ul>Stubs </ul>
<ul>Estilos de teste com Mocks </ul>
<ul>Behavior Driven Development </ul><ul>desenvolvendo orientado ao comportamento </ul>
@Test public   void  shouldRollbackActiveTransactions(){ given ( transaction .isActive()).willReturn( true ); manager .per...
<ul>Obrigado! </ul><ul>Lucas Cavalcanti @lucascs Rafael Ferreira @rafaeldff <li>http://www.caelum.com.br </li></ul>
Upcoming SlideShare
Loading in …5
×

Palestra Mocks - AgileBrazil 2010

718 views
659 views

Published on

Slides com dicas para programar usando mocks, apresentadas na conferência AgileBrazil 2010.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
718
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
7
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Palestra Mocks - AgileBrazil 2010

  1. 1. <ul>Já que vai fingir, finja direito Testando com Mocks </ul><ul><li>Lucas Cavalcanti @lucascs Rafael Ferreira @rafaeldff </li></ul>
  2. 2. <ul>Testes unitários </ul>
  3. 3. <ul>Seu código é testável? </ul>public class Programa { public static void executa() { BancoDeDados bd = new BancoDeDados(); EnviadorDeEmail enviador = new EnviadorDeEmail(); Usuario usuario = Usuario. getAtual (); if (bd.autentica(usuario)) { enviador.enviaEmail(usuario); } } }
  4. 4. <ul>Injeção de dependências </ul>
  5. 5. <ul>Código mais testável </ul>public class Mecanico { public Mecanico(ChaveDeFenda fenda, ChaveInglesa inglesa, CalendarioPorno calendario) { ... } public void trocaMotor(Carro carro) { try { Motor motor = carro.getMotor(); fenda .remove(motor); } catch (TopadaNoDedaoException e) { xingaMuitoNoTwitter(e); } } }
  6. 6. <ul>Teste #comofas </ul>
  7. 7. <ul>Como criar um Mecanico? </ul>ChaveDeFenda fenda = vaiNaCaixaEBuscaAChaveDeFenda (); ChaveInglesa inglesa = vaiNaCaixaEBuscaAChaveInglesa (); CalendarioPorno calendario = vaiNaLojaECompraOCalendario (); Mecanico mecanico = new Mecanico(fenda, inglesa, calendario); //resto do teste...
  8. 8. <ul>Mocks </ul>
  9. 9. <ul>Como criar um Mecanico? </ul>ChaveDeFenda fenda = mock ( ChaveDeFenda.class ); ChaveInglesa inglesa = mock ( ChaveInglesa.class ); CalendarioPorno calendario = mock ( CalendarioPorno.class ); Mecanico mecanico = new Mecanico(fenda, inglesa, calendario); // resto do teste...
  10. 10. <ul>Test Smells </ul><ul>Quando seu teste diz que há algo de errado </ul>
  11. 11. <ul>Nomes ruins </ul>public class LancadorTest { public void testDispara() { // coisas complicadas } }
  12. 12. <ul>Nomes ruins </ul>public class LancadorTest { public void disparaMisseisQuandoUmAtaqueNuclearForDetectado(){ // coisas escabrosas } } X
  13. 13. <ul>Testes muito grandes </ul>public void testEnaganaOCliente() { Parafuseta parafuseta = new Parafuseta( new Estepe()); List<Cavalo> cavalos = Collections. nCopies (123, new Cavalo(Cor.BRANCO)); parafuseta.setMotor( new Motor(cavalos)); Peca rebimbocaDaParafuseta = new Rebimboca(parafuseta); Cliente cliente = mockery.mock(Cliente. class ); mockery.checking( new Expectations() {{ one(cliente).recebePreco(Double. MAX_VALUE ); one(cliente).recebePreco(Double. MAX_VALUE / 2); one(cliente).naoTemUmJeitinho( true ); one(cliente).recebePreco(1.99d); }}); Mecanico mecanico = new Mecanico(); mecanico.forneceOrcamento(rebimbocaDaParafuseta, cliente); }
  14. 14. <ul>Testes muito grandes </ul>public void testEnganaOCliente() { Cliente cliente = mockery.mock(Cliente. class ); esperandoNegociacao(cliente); mecanico.forneceOrcamento(umaPecaInventada(), cliente); } public void esperandoNegociacao(Cliente cliente) { mockery.checking( new Expectations() {{ one(cliente).recebePreco(Double. MAX_VALUE ); one(cliente).recebePreco(Double. MAX_VALUE / 2); one(cliente).naoTemUmJeitinho( true ); one(cliente).recebePreco(1.99d); }}); } public Peca umaPecaInventada() { Parafuseta parafuseta = new Parafuseta( new Estepe()); List<Cavalo> cavalos = Collections. nCopies (123, new Cavalo(Color.BRANCO)); parafuseta.setMotor( new Motor(cavalos)); return new Rebimboca(parafuseta); } X
  15. 15. <ul>Muitas dependências </ul>public void disparaMisseisNuclearesQuandoAtaqueForDetectado() { DetectorAereo detectorAereo = mock (DetectorAereo. class ); DetectorDeSubmarino detectorDeSubmarino = mock (DetectorDeS... ComandoRemoto comandoRemoto = mock (ComandoRemoto. class ); SensorDePopularidade sensorDePopularidade = mock (SensorDePo... Gps gpsDoBinLaden = mock (Gps. class ); Rebimboca rebimbocaDaParafuseta = mock (Rebimboca. class ); Lancador lancador = new Lancador(detectorAereo, detectorDeSubmarino, c omandoRemoto, sensorDePopularidade, gpsDoBinLaden, rebimbocaDaParafuseta); // coisas cabeludas... }
  16. 16. <ul>Muitas dependências </ul>public void disparaMisseisNuclearesQuandoAtaqueForDetectado() { DetectorDeAtaque detectorDeAtaque = mock (DetectorDeAtaque... Rebimboca rebimbocaDaParafuseta = mock (Rebimboca. class ); Lancador lancador = new Lancador(detectorDeAtaque, rebimbocaDaParafuseta); // coisas do arco da velha... } X
  17. 17. <ul>Dependências escondidas </ul>public class Pedido { private static final int TRES_HORAS = 3*60*60*1000; private Date dataDeCriacao = new Date(); public boolean isExpirado() { long agora = System. currentTimeMillis (); return agora - dataDeCriacao .getTime() < TRES_HORAS ; } } public void testaSeEstaExpiradoDepoisDeTresHoras() throws Exception { Pedido pedido = new Pedido(); Thread. sleep ( TRES_HORAS ); //?! assertTrue (pedido.isExpirado()); }
  18. 18. <ul>Dependências escondidas </ul>public class Pedido { private final Date dataDeCriacao ; public Pedido(Relogio relogio) { this . dataDeCriacao = relogio.agora(); } public boolean isExpirado(Date data) { return data.getTime() - dataDeCriacao .getTime() < TRES_HORAS ; } } public void testaSeEstaExpiradoDepoisDeTresHoras() { final Relogio relogio = mockery .mock(Relogio. class ); mockery .checking( new Expectations() {{ one(relogio).agora(); will(returnValue( tresHorasAtras()) ; }}); Pedido pedido = new Pedido(relogio); assertTrue (pedido.isExpirado( agora ())); } X
  19. 19. <ul>Testes frágeis </ul>@Test public void enviaEmailDeSenha() { Usuario usuario = new Usuario(); mockery.checking( new Expectations() {{ one(dao).buscaUsuario(1); one(template).compoeEmailDeSenha(usuario); one(configuracao).servidorSmtp(); one(enviadorDeEmail).envia(servidor, email, usuario); }}); controller.enviaEmailDeSenha(1); }
  20. 20. <ul>Testes frágeis </ul>@Test public void enviaEmailDeSenha() { Usuario usuario = new Usuario(); mockery.checking( new Expectations() {{ one(enviadorDeEmail).envia(servidor, email, usuario); }}); controller.enviaEmailDeSenha(1); } @Before public void setUp() { mockery .checking( new Expectations() { { allowing(dao).buscaUsuario(1); allowing(template).compoeEmailDeSenha(usuario); allowing(configuracao).servidorSmtp(); }}); } X
  21. 21. <ul>Stubs </ul>
  22. 22. <ul>Estilos de teste com Mocks </ul>
  23. 23. <ul>Behavior Driven Development </ul><ul>desenvolvendo orientado ao comportamento </ul>
  24. 24. @Test public void shouldRollbackActiveTransactions(){ given ( transaction .isActive()).willReturn( true ); manager .persist( ANY_ENTITY ); verify ( transaction ).rollback(); } Given When Then
  25. 25. <ul>Obrigado! </ul><ul>Lucas Cavalcanti @lucascs Rafael Ferreira @rafaeldff <li>http://www.caelum.com.br </li></ul>

×