groovy : Map jako implementacja interfejsu

W groovy można bardzo szybko zaimplementować interfejs używając do tego mapy (Map).
Jest to szczególnie użyteczne podczas testowania (np. jeśli potrzebny jest mock).

Jako przykładu użyję prostego interfejsu i klasy która interfejs używa.
Jeśli chcemy przetestować klasę jednostkowo (unit test), musimy zmockować interfejs.
Oczywiście można użyć jakiegoś framework-u (mockito, easymock, itp) … ale po co jeśli jest groovy? Jeśli nie zależy nam na sprawdzaniu kolejności użytych metod, co mock frameworki-i wspierają, i chcemy utrzymać prostotę w testach groovy zamiata :)

Użyję składni groovy choć równie dobrze interfejs oraz klasa może być napisana w javie.
Podany kod można skopiować do groovy konsoli (terminal groovyConsole) i uruchomić.

Najpierw interfejs:

interface WaznyInterfejs {
int policz(int n)
void wyswietlWynik(int n)
}

Klasa:

class UzywaWaznego {
WaznyInterfejs waznyInterfejs;

int policzOrazWyswietl(int arg) {
int wartosc = waznyInterfejs.policz(arg)
waznyInterfejs.wyswietlWynik(wartosc);
wartosc
}
}

No i teścik:

// implementacja interfejsu jako mapy!
WaznyInterfejs mock = [
wyswietlWynik: {
println 'wyswietlam wynik'
},
policz: {
println 'policzylem';
return 34
}
] as WaznyInterfejs

UzywaWaznego klient = new UzywaWaznego()
// przypisanie interfejsu do obiektu
klient.waznyInterfejs = mock
// test
assert 34 == klient.policzOrazWyswietl(2)

i w ten sposób zamiast ciężkich mock frameworków mamy lekką implementację groovy.
Dodam jeszcze iż w groovy można, używając mapy jako parametru konstruktora, zainicjować obiekt .

Informacje o @albgorski

Od 1999 roku profesjonalnie zajmuję się rozwijaniem oprogramowania. Głównie Java, ale także Groovy, PHP, HTML, JavaScript oraz Adobe Flex. Fascynują mnie metody wymiany danych, ich przechowywania oraz dostępowania. Jestem WIELKIM zwolennikiem Clean Code, TDD oraz agilistą (może lepiej lean-istą). Ekosystem Java dostarcza WIELE świetnych frawework-ów i bibliotek, a społeczność miłośników języka Java jest najlepsza pod słońcem :)
Ten wpis został opublikowany w kategorii groovy, java i oznaczony tagami , , , , . Dodaj zakładkę do bezpośredniego odnośnika.

Możliwość komentowania jest wyłączona.