Blamiblog

Al·lucino jugant amb els mocs!

Posted in Avatars tècnics by blami on 8 Juliol 2008

Quina passada! Això del Mockito és brutal per provar aplicacions!

El vaig descobrir al Head First Software Development, però no vaig acabar d’entendre quina gràcia tenia crear classes falses. Clar, es que primer em calia posar-me a desenvolupar en mode test driven.

I de debò que funciona fàcil! He tret totes les classes falses que havia construït “a ma” i les he substituïdes per les “mocks” en un moment!

Un exemple:

/**
* Prova addAreas() quan una única àrea és afegida amb èxit */
@Test
public void addOneArea() {
// Mock model
SkzModelInterface model = mock(SkzModelInterface.class);
stub(model.folderSuitable(TEST_HOST_URL)).toReturn(true);
stub(model.hostExists(TEST_HOST_URL)).toReturn(true);
stub(model.folderSuitable(TEST_AREA_1_URL)).toReturn(true);
stub(model.areaExists(TEST_HOST_URL, TEST_AREA_1_URL)).toReturn(false);
stub(model.addArea(TEST_HOST_URL, TEST_AREA_1_URL)).toReturn(TEST_AREA_1_ID);
// Mock view
SkzViewInterface view = mock(SkzViewInterface.class);
// instància a provar
SkzControl control = new SkzControl(view, model);
control.addAreas(TEST_HOST_URL, TEST_AREAS_URL);
// validacions
verify(model, never()).createHost(TEST_HOST_URL);
verify(model).addArea(TEST_HOST_URL, TEST_AREA_1_URL);
verify(view).notifyAreaAdded(TEST_HOST_URL, TEST_AREA_1_URL, TEST_AREA_1_ID);
}

La idea és:
1. et crees un objecte mock
SkzModelInterface model = mock(SkzModelInterface.class);
2. defineixes, si et cal, què ha de retornar un mètode quan rep quelcom
stub(model.folderSuitable(TEST_HOST_URL)).toReturn(true);
3. fas les crides pertinents a l’objecte que estiguis provant. En el cas de l’exemple, he fet que l’objecte control tingui com a model, el mock que he creat. Així puc després comprovar que hagi fet les crides que espero que faci.
SkzControl control = new SkzControl(view, model);
control.addAreas(TEST_HOST_URL, TEST_AREAS_URL);

4. i finalment comproves si s’ha produït la crida que esperes al mock
verify(model).addArea(TEST_HOST_URL, TEST_AREA_1_URL);

Què fàcil, no? i tot simplement afegint el mockito-all-1.4.jar al classpath (o a la llibreria de test del NetBeans 😛 ) i important-lo a la classe de junit amb
import static org.mockito.Mockito.*;

Ja l’estic traient beneficis sense ni tant sols haver començat a mirar-me utilitats com els matchers! Segur que molt del que estic fent, encara es podria fer molt millor. En tot cas, poc a poc…
Clar que això no ho podria estar provant amb una pressió de temps excessiva sobre el projecte. Avantatges d’estar de vacances i de ser prou “friki” com per destinar-ne una part a actualitzar-me 😛

Anuncis

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out / Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out / Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out / Canvia )

Google+ photo

Esteu comentant fent servir el compte Google+. Log Out / Canvia )

Connecting to %s

%d bloggers like this: