Tdd With Mockito

24
Filippo Diotalevi - [email protected] – Jug Milano Javaday Roma III Edizione – 24 gennaio 2009 Test Driven Development con Filippo Diotalevi Java User Group Milano [email protected]

description

 

Transcript of Tdd With Mockito

Page 1: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

1

Test Driven Development con

Filippo DiotaleviJava User Group Milano [email protected]

Page 2: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

AGENDA

2

Hello, I’m a Mock

TDDAll code is guilty

until proven innocent

Page 3: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

3

Test Driven Development

TDDAll code is guilty

until proven innocent

Page 4: Tdd With Mockito

?

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

4

Test Driven Development

Come realizziamo il nostro software

Page 5: Tdd With Mockito

?

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

5

Test Driven Development

Il mio codice funziona?

Come funziona il mio codice?

Il mio codice è manutenibile (da altri)?

Page 6: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

6

Test Driven Development

Approccio alternativo (TDD)

Non scrivere codice senza che esista un test automatico (che fallisca)

Elimina le duplicazioni

Page 7: Tdd With Mockito

Rosso

Verde

Rifattorizza

Test non compilano, o falliscono

OK!

Eliminiamo duplicazioni e compromessi

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

Ritmo

7

Page 8: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

8

Page 9: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

Mock Object

9

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

Page 10: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

Mock Object: perché?

10

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!

Page 11: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

Mock Object

11

Il più semplice degli esempi

(aka Fake class)

public class DumbHttpRequestMock implements HttpServletRequest { public String getAuthType() { return null; }

public String getContextPath() { return null; }

public Cookie[] getCookies() { return null; }

public long getDateHeader(String arg0) { return 0; }

public String getHeader(String arg0) { return "MY-HEADER-VALUE"; }

public Enumeration getHeaderNames() { return null; }

Page 12: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

Mock Object

12

Sfortunatamente:

... non sempre abbiamo interfacce chiaramente definite

... è spesso complicato o lungo creare delle implementazioni fake

... è poco flessibile

Page 13: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

Mock Objects: caratteristiche

13

Il “Mock Object” ideale:

... può essere definito dinamicamente

... permette di creare, velocemente, stub di metodi

... permette di verificare le interazioni con gli altri oggetti

Page 14: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

Mockito

14

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

Page 15: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

Mockito: Setup

15

import static org.mockito.Mockito.*;

Download mockito-1.6.jar

Page 16: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

16

Page 17: Tdd With Mockito

HttpServletRequest req = mock(HttpServletRequest.class);

@Mock HttpServletRequest req;

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

Mockito: Mock dinamico

17

Page 18: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

verify(mockOne).add("one"); //verifica l’invocazione

//verifica la non-invocazione verify(mockOne, never()).add("two");

//nessuna interazione verifyZeroInteractions(mockTwo, mockThree);

//verifica dell’ordine delle invocazioni InOrder inOrder = inOrder(firstMock, secondMock); inOrder.verify(firstMock).add("was called first"); inOrder.verify(secondMock).add("was called second");

Mockito: Verifiche

18

Page 19: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

Mockito: Argument Matchers

19

Default Matchers:

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

anyBoolean, anyByte, anyChar, anyCollection, anyDouble, anyFloat, anyInt, anyList, anyLong, anyMap, anyObject, anyShort, anyString, argThat

Page 20: Tdd With Mockito

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 - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

Mockito: Argument Matchers

20

Custom Matchers:

Page 21: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

Mockito: Stub

21

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

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

Page 22: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

Conclusione

22

TDD permette di scrivere codice affidabile

e comprensibile

Page 23: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

Conclusione

23

I Mock Objects (e Mockito)

permettono di testare in modo completo gli oggetti

senza preoccuparsi delle dipendenze da sistemi/componenti esterni

Page 24: Tdd With Mockito

Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009

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

24

Riferimenti