Tutorial su Mockito al JUG di Milano (28 Maggio 2015) - ITALIAN

download Tutorial su Mockito al JUG di Milano (28 Maggio 2015) - ITALIAN

If you can't read please download the document

Transcript of Tutorial su Mockito al JUG di Milano (28 Maggio 2015) - ITALIAN

  1. 1. Tutorial (JUG Milano Meeting 69 Maggio 2015) Gualtiero Testa [email protected] www.gualtierotesta.it @gualtierotesta www.linkedin.com/in/gualtierotesta
  2. 2. 29/05/2015 Tutorial Mockito 2 Indice Esempio 1 : uso canonico di Mockito Teoria: schema logico di un test Esempio 2 : osservare gli output Teoria: dove si usa il mocking Esempio 3: partial mocking Teoria: scheda su Mockito e AssertJ, Mockito vs EasyMock Esempio 4: integration test con mocking Sintassi
  3. 3. 29/05/2015 Tutorial Mockito 3 Progetto pratico Nelle pagine web di un forum si vuole mostrare il numero di utenti connessi in quel momento. Realizzare una funzione che restituisce una stringa con il numero di utenti connessi Esempio di output Nessun utente connesso 1 utente connesso 5 utenti connessi
  4. 4. 29/05/2015 Tutorial Mockito 4 Esempio 1 Obiettivo: l'uso tipico di Mockito: per controllare gli input Caso con dipendenza esterna: il numero di utente connessi calcolato da un metodo di un'altra classe chiamato dal nostro metodo Una istanza della classe esterna passata alla classe sotto test Codice testabile
  5. 5. 29/05/2015 Tutorial Mockito 5 Schema logico di un test System under test (SUT) INPUT (da controllare) OUTPUT (da osservare) GIVEN WHEN THEN
  6. 6. 29/05/2015 Tutorial Mockito 6 Input (da controllare) Parametri passati al metodo sotto test Costanti Configurazioni: variabili d'ambiente, file... Valori restituiti da altri metodi della stessa classe o di classi esterne Risposte da webservice, query su DB, lettura di code,.... Azioni dell'utente Eventi in genere
  7. 7. 29/05/2015 Tutorial Mockito 7 Esempio 2 Obiettivo: Usare i mock per osservare e verificare gli output del codice sotto test Argomenti: Verify, times capture matcher
  8. 8. 29/05/2015 Tutorial Mockito 8 Output (da osservare) Il valore di ritorno del metodo sotto test (se non void) I metodi chiamati durante l'esecuzione: Chi stato chiamato e con quali parametri Quante volte stato chiamato In quale sequenza Risultati azioni e cambiamenti di stato Es. file creato/inviato
  9. 9. 29/05/2015 Tutorial Mockito 9 Dove si usa il mocking ? Presentation Services Business logic Data (EIS) ?
  10. 10. 29/05/2015 Tutorial Mockito 10 Mockito http://mockito.org/ Creato da Szczepan Faber (PL) Versione corrente : Stabile: 1.10.19 (Dic '14) Ultima: 2.0.x (in beta) Disponibile anche su Android I mock sono proxy creati dinamicamente con CGLib
  11. 11. 29/05/2015 Tutorial Mockito 11 Cosa manca In alcuni casi, Mockito non pu aiutarci: Metodi e classi static, final, private Enum Dipendenze create nel metodo (con il new) Dipendenze definite nel costruttore e negli inizializzatori In questi casi si pu usare PowerMock O migliorare il codice ;-)
  12. 12. 29/05/2015 Tutorial Mockito 12 AssertJ (http://joel-costigliola.github.io/assertj/) Libreria di asserzioni: utile per osservare e validare gli output del test Alternativa a quella di jUnit (Hamcrest) Punto di ingresso: Assertions.assertThat(x) A cui aggiungere, in maniera fluent, i controlli che dipendono dal tipo di x Es. se X una collection contenente JUG, MILANO assertThat(x).hasSize(2).contains(JUG).doesNotContain(PUG) Versione corrente: 2.0 (Marzo 2015) (3.0 per Java8)
  13. 13. 29/05/2015 Tutorial Mockito 13 Esempio 3 Obiettivo: partial mocking, test del codice nelle classi abstract Argomenti: Partial mocking Spy Mockito.doReturn().when()
  14. 14. 29/05/2015 Tutorial Mockito 14 Mockito vs EasyMock [1] EASYMOCK MyClassmock=createNiceMock(MyClass.class); expect(mock.meth1(0)).andStubReturn("one"); mock.meth2(); replay(mock); methodUnderTest(); verify(mock);//Failifmeth2notinvoked MOCKITO MyClassmock=mock(MyClass.class); when(mock.meth1(0)).thenReturn("one"); methodUnderTest(); verify(mock).meth2();
  15. 15. 29/05/2015 Tutorial Mockito 15 Mockito vs EasyMock [2] Approccio Mockito (given, when, then): Crea il mock e gli stub Esegui il metodo sotto test Verifica risultati attesi Approccio EasyMock (record, playback) Crea il mock e gli stub Usa il metodo come dovrebbe eseguirlo il metodo sotto test Esegui il metodo sotto test Verifica altri risultati attesi
  16. 16. 29/05/2015 Tutorial Mockito 16 Esempio 4 Obiettivo: il mocking per ridurre il peso degli integration test Quando disponibili (ad es. Spring) usiamo i mock disponibili nel framework utilizzato
  17. 17. 29/05/2015 Tutorial Mockito 17 Sintassi: creazione mock Senza annotation: MyClassmockedInst=Mockito.mock(MyClass.class) MyInterfacemockedInst=Mockito.mock(MyInterface.class) Con annotation e runner Mockito @RunWith(MockitoJUnitRunner.class) @MockMyClassmockedInst Con annotation (quando si usa un'altro runner) MockitoAnnotations.initMocks(MyClass) @MockMyClassmockedInst
  18. 18. 29/05/2015 Tutorial Mockito 18 Sintassi: stubbing Standard: Mockito.when(mock.method(params)) .thenReturn(...)//perrispostestatiche .thenAnswer(Answer)//perrispostecalcolate .thenThrow(throwable) .thenCallRealMethod()//richiamailverocodice BDDMockito.given(mock.method(params)).will* Spy partial mocking: Mockito.do*(xxxx).when(mock).method(params) Nota: Il metodo non viene eseguito. Il when vuole solo il mock.
  19. 19. 29/05/2015 Tutorial Mockito 19 Sintassi: verifica Verifica invocazione singolo metodo verify(mock,).method(params) Times:times(n),never(),atLeast(n),atMost(n) Verifica interazioni con mock verifyZeroInteractions(mock) verifyNoMoreInteractions(mock) Matching argomenti: anyInt,anyString, anyClass,..
  20. 20. 29/05/2015 Tutorial Mockito 20 Sintassi: capture degli argomenti Given: ArgumentCaptorcapture= ArgumentCaptor.forClass(OneClass.class); @CaptorArgumentCaptorcapture When: Then: verify(mock).doSomethingOnOneClass(argument.capture()); OneClassarg=argument.getValue(); assert....
  21. 21. 29/05/2015 Tutorial Mockito 21 E adesso ? Beviamoci sopra