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
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
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
Test Driven Development
?
Come realizziamo il nostro software
Filippo Diotalevi - filippo@diotalevi.com – Jug Milano
Javaday Roma III Edizione – 24 gennaio 2009
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
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
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
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”
Filippo Diotalevi - filippo@diotalevi.com – Jug Milano
Javaday Roma III Edizione – 24 gennaio 2009
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
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 \"MY-HEADER-VALUE\";
}
getHeaderNames() {
public Enumeration
return null;
}
Filippo Diotalevi - filippo@diotalevi.com – Jug Milano
Javaday Roma III Edizione – 24 gennaio 2009
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
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
Mockito
http://code.google.com/p/mockito/
Filippo Diotalevi - filippo@diotalevi.com – Jug Milano
Javaday Roma III Edizione – 24 gennaio 2009
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
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;
Filippo Diotalevi - filippo@diotalevi.com – Jug Milano
Javaday Roma III Edizione – 24 gennaio 2009
Mockito: Verifiche
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\");
Filippo Diotalevi - filippo@diotalevi.com – Jug Milano
Javaday Roma III Edizione – 24 gennaio 2009
Mockito: Argument Matchers
Default Matchers:
when(req.getHeader(anyString()).thenReturn(\"HI!\");
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
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
Mockito: Stub
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 - filippo@diotalevi.com – Jug Milano
Javaday Roma III Edizione – 24 gennaio 2009
Conclusione
TDD permette di scrivere codice affidabile
e comprensibile
Filippo Diotalevi - filippo@diotalevi.com – Jug Milano
Javaday Roma III Edizione – 24 gennaio 2009
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
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
0 comments
Post a comment