Testarea aplicatiilor software cu JUnit5 si EasyMock
Sunt foarte multe proiecte bune, deja scrise, care ne ajuta sa facilitam folosirea de mock objetcs in proiectele noastre Java. In aceasta serie de articole, ne uitam mai atent la trei dintre cele mai folosite mock frameworks: EasyMock, JMock si Mockito. In acest articol discutam despre EasyMock.
1. Folosirea EasyMock
Easymock este un framework open-source care ofera acces mai multe clase utile pentru mocking objects.
Pentru a folosi acest framework trebuie sa adaugam dependencies in fisierul pom.xml (figura 1) :
Figura 1
Figura 2 prezinta un Account object foarte simplu cu doua proprietati: un account ID si un sold.
Figura 2
Figura 3 arata interfata AccountManager care coordoneaza life cycle si persistenta Account objects (care sunt limitate la identificarea conturilor pe baza de ID si actualizarea acestora):
Figura 3
Figura 4 arata metoda transfer dezvoltata pentru a transfera banii intre 2 conturi. Foloseste interfata Account Manager, modificata anterior, pentru a gasit conturile de debit si credit prin intermediul unui ID si pentru a le actualiza.
Figura 4
Vrem sa putem sa facem un unit test pe comportamentul AccountService.transfer. Pentru acest scop, pana cand implementarea interfetei AccountManager este gata, vom folosi o mock implementation a interfetei AccountManager deoarece metoda de transfer foloseste interfata si trebuie sa o testam in izolare.
Pentru a introduce EasyMock, creeam testul TestAccountService folosind EasyMock, ca in figura de mai jos.
Figura 5
Mai exact ceea ce facem este sa:
- Incepem listarea prin definirea informatiilor de care avem nevoie si pe care le importam din libraria EasyMock (1). Putem vedea ca ne bazam destul de mult pe static imports.
- La punctul (2) declaram obiectul pe care vrem sa il imitam. Putem sa observam ca AccountManager este o interfata; motivul din spatele acestui lucru este simplu — frameworkul core EasyMock poate sa imite doar interface objects.
- La punctul (3) apelam metoda createMock pentru a crea o imitatie a clasei pe care o vrem.
- La punctul (4) creeam doua account objects pe care le vom folosi in testele noastre. Apoi declaram lucrurile la care ne asteptam.
- Cu EasyMock declaram asteptarile in 2 moduri. Cand metoda return type este anulata, o apelam la mock-object (pasul (5)). Sau cand metoda returneaza orice fel de obiect, atunci trebuie sa folosim metodele expect-andReturn din EasyMock API (6).
- In momentul in care am terminat acest aspect, trebuie sa apelam metoda replay pentru a anunta acest lucru (7).
- In pasul (8) apelam metoda transfer pentru a transfera niste bani intre cele doua conturi iar la (9) facem assert pe rezultatul asteptat.
- Metoda @AfterEach este executata dupa ce fiecare metoda @Test se asigura ca asteptarile sunt verificate. Cu EasyMock putem sa apelam metoda verify cu orice mock object (10), pentru a verifica daca method-call expectations pe care le declaram sunt activate. Includerea acestei etape de verificare in metoda @AfterEach ne permite sa introducem noi teste cu usurinta — si ne vom baza pe executarea metodei verify de aici.
Vrei sa inveti mai multe despre aceasta tehnologie? Descopera cursurile noastre.
Catalin Tudose
Java and Web Technologies Expert
Originally published at https://www.luxoft-training.ro.