Upload
filippo-diotalevi
View
3.556
Download
0
Embed Size (px)
DESCRIPTION
Citation preview
Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009
1
Test Driven Development con
Filippo DiotaleviJava User Group Milano [email protected]
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
Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009
3
Test Driven Development
TDDAll code is guilty
until proven innocent
?
Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009
4
Test Driven Development
Come realizziamo il nostro software
?
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)?
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
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
Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009
8
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”
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!
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; }
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
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
Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009
Mockito
14
http://code.google.com/p/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
Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009
16
HttpServletRequest req = mock(HttpServletRequest.class);
@Mock HttpServletRequest req;
Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009
Mockito: Mock dinamico
17
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
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
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:
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
Filippo Diotalevi - [email protected] – Jug MilanoJavaday Roma III Edizione – 24 gennaio 2009
Conclusione
22
TDD permette di scrivere codice affidabile
e comprensibile
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
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