Test Driven Development con

Filippo Diotalevi
Java User Group Milano
filippo@diotalevi.com




                         Fi...
AGENDA


    TDD
  All code is guilty
until proven innocent
                        Hello,
                            I’m...
Test Driven Development



    TDD
  All code is guilty
until proven innocent




         Filippo Diotalevi - filippo@dio...
Test Driven Development

                                                     ?
Come realizziamo il nostro software




  ...
Test Driven Development


                                                             ?
Il mio codice funziona?

Come fun...
Test Driven Development

Approccio alternativo (TDD)


  Non scrivere codice senza che esista un test
          automatico...
Ritmo



  Rosso        Test non compilano, o falliscono



  Verde           OK!


Rifattorizza   Eliminiamo duplicazioni...
Filippo Diotalevi - filippo@diotalevi.com – Jug Milano
              Javaday Roma III Edizione – 24 gennaio 2009
Mock Object




...è un oggetto che simula, in un modo controllato,
      il comportamento di un oggetto “reale”


       ...
Mock Object: perché?


Non è possible utilizzare l’oggetto reale in unit test perchè:

 ... necessita di un container/stat...
Mock Object
                                   DumbHttpRequestMock implements HttpServletRequest
                    publi...
Mock Object


Sfortunatamente:

... non sempre abbiamo interfacce chiaramente definite

... è spesso complicato o lungo cre...
Mock Objects: caratteristiche


Il “Mock Object” ideale:

... può essere definito dinamicamente

... permette di creare, ve...
Mockito




           http://code.google.com/p/mockito/



Filippo Diotalevi - filippo@diotalevi.com – Jug Milano
       ...
Mockito: Setup



       Download mockito-1.6.jar



import static org.mockito.Mockito.*;




                   Filippo D...
Filippo Diotalevi - filippo@diotalevi.com – Jug Milano
              Javaday Roma III Edizione – 24 gennaio 2009
Mockito: Mock dinamico



HttpServletRequest req =
   mock(HttpServletRequest.class);




@Mock HttpServletRequest req;


...
Mockito: Verifiche

verify(mockOne).add(quot;onequot;);      //verifica l’invocazione



//verifica la non-invocazione
ver...
Mockito: Argument Matchers

Default Matchers:

  when(req.getHeader(anyString()).thenReturn(quot;HI!quot;);




        an...
Mockito: Argument Matchers

Custom Matchers:


class IsListOfTwoElements extends ArgumentMatcher<List> {
   public boolean...
Mockito: Stub

when(req.getHeader(“myheader”)).thenReturn(quot;HI!quot;);


when(req.getSession().thenThrow(new RuntimeExc...
Conclusione




TDD permette di scrivere codice affidabile


            e comprensibile




                    Filippo D...
Conclusione



           I Mock Objects (e Mockito)

permettono di testare in modo completo gli oggetti

 senza preoccupa...
Riferimenti

Wikipedia, TDD, http://en.wikipedia.org/wiki/Test-driven_development


Test Driven Development: By Example, K...
Upcoming SlideShare
Loading in...5
×

Tdd With Mockito

2,004

Published on

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

No Downloads
Views
Total Views
2,004
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
58
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Tdd With Mockito

  1. 1. Test Driven Development con Filippo Diotalevi Java User Group Milano filippo@diotalevi.com Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  2. 2. AGENDA TDD All code is guilty until proven innocent Hello, I’m a Mock Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  3. 3. Test Driven Development TDD All code is guilty until proven innocent Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  4. 4. Test Driven Development ? Come realizziamo il nostro software Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  5. 5. Test Driven Development ? Il mio codice funziona? Come funziona il mio codice? Il mio codice è manutenibile (da altri)? Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  6. 6. Test Driven Development Approccio alternativo (TDD) Non scrivere codice senza che esista un test automatico (che fallisca) Elimina le duplicazioni Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  7. 7. Ritmo Rosso Test non compilano, o falliscono Verde OK! Rifattorizza Eliminiamo duplicazioni e compromessi Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  8. 8. Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  9. 9. Mock Object ...è un oggetto che simula, in un modo controllato, il comportamento di un oggetto “reale” Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  10. 10. Mock Object: perché? Non è possible utilizzare l’oggetto reale in unit test perchè: ... necessita di un container/stato ... richiede l’integrazione con sistemi esterni (non disponibili in sviluppo) ... non esiste ancora! Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  11. 11. Mock Object DumbHttpRequestMock implements HttpServletRequest public class { public String getAuthType() { return null; } public String getContextPath() { return null; Il più semplice } degli esempi public Cookie[] getCookies() { return null; } (aka Fake class) public long getDateHeader(String arg0) { return 0; } getHeader(String arg0) { public String return quot;MY-HEADER-VALUEquot;; } getHeaderNames() { public Enumeration return null; } Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  12. 12. Mock Object Sfortunatamente: ... non sempre abbiamo interfacce chiaramente definite ... è spesso complicato o lungo creare delle implementazioni fake ... è poco flessibile Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  13. 13. Mock Objects: caratteristiche Il “Mock Object” ideale: ... può essere definito dinamicamente ... permette di creare, velocemente, stub di metodi ... permette di verificare le interazioni con gli altri oggetti Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  14. 14. Mockito http://code.google.com/p/mockito/ Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  15. 15. Mockito: Setup Download mockito-1.6.jar import static org.mockito.Mockito.*; Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  16. 16. Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  17. 17. Mockito: Mock dinamico HttpServletRequest req = mock(HttpServletRequest.class); @Mock HttpServletRequest req; Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  18. 18. Mockito: Verifiche verify(mockOne).add(quot;onequot;); //verifica l’invocazione //verifica la non-invocazione verify(mockOne, never()).add(quot;twoquot;); //nessuna interazione verifyZeroInteractions(mockTwo, mockThree); //verifica dell’ordine delle invocazioni InOrder inOrder = inOrder(firstMock, secondMock); inOrder.verify(firstMock).add(quot;was called firstquot;); inOrder.verify(secondMock).add(quot;was called secondquot;); Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  19. 19. Mockito: Argument Matchers Default Matchers: when(req.getHeader(anyString()).thenReturn(quot;HI!quot;); anyBoolean, anyByte, anyChar, anyCollection, anyDouble, anyFloat, anyInt, anyList, anyLong, anyMap, anyObject, anyShort, anyString, argThat Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  20. 20. Mockito: Argument Matchers Custom Matchers: class IsListOfTwoElements extends ArgumentMatcher<List> { public boolean matches(Object list) { return ((List) list).size() == 2; } } List mock = mock(List.class); when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true); Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  21. 21. Mockito: Stub when(req.getHeader(“myheader”)).thenReturn(quot;HI!quot;); when(req.getSession().thenThrow(new RuntimeException()); when(req.getHeader(“myheader”)).thenAnswer(new Answer<String>() { public String answer(InvocationOnMock invocation) throws Throwable { return (String) invocation.getArguments()[0]; } Stub & Callback } Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  22. 22. Conclusione TDD permette di scrivere codice affidabile e comprensibile Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  23. 23. Conclusione I Mock Objects (e Mockito) permettono di testare in modo completo gli oggetti senza preoccuparsi delle dipendenze da sistemi/ componenti esterni Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  24. 24. Riferimenti Wikipedia, TDD, http://en.wikipedia.org/wiki/Test-driven_development Test Driven Development: By Example, Kent Beck, Addison-Wesley Longman, 20 Wikipedia, Mock objects, http://en.wikipedia.org/wiki/Mock_object Martin Fowler, Mocks aren’t stubs, http://martinfowler.com/articles/mocksArentStubs.html Filippo Diotalevi - filippo@diotalevi.com – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×