Testarea aplicatiilor software cu JUnit5 si EasyMock. Partea a doua
Testarea aplicatiilor software cu JUnit5 si EasyMock. Partea a doua
Cea de-a doua parte a articolului nostru despre testarea aplicatiilor cu JUnit5 si EasyMock. Vom aborda bunele practici legate de JUnit si EasyMock object creation.
3 Nov 2020
599
Other articles
Object-relational Mapping folosind JPA, Hibernate si Spring Data JPA. Persistence cu JPA
Cum sa interogam Kafka Streaming Data?
Procrastinarea. Care sunt avantajele ei?
Object-relational Mapping folosind JPA, Hibernate si Spring Data JPA
Procrastinarea
Cerinte. De ce avem nevoie de ele?
Dezvolta-ti abilitatile cu training-urile noastre
Programarea reactiva Java. Implementari
Testarea software. Intrebari tipice si raspunsuri. Continuare
Testarea software. Intrebari tipice si raspunsuri
Bune practici JUnit. EasyMock object creation
Un sfat care este bine de stiut legat de metoda createMock. Daca verifici API-ul EasyMock poti vedea ca metoda createMock vine la pachet cu mai multe semnaturi. Semnatura pe care o folosim este:
Pe care dintre ele ar trebui sa le folosim? createMock(String name, Class claz) este mai buna. Daca folosesti createMock(Class claz) si asteptarile tale nu sunt indeplinite primesti un mesaj de eroare precum cel de mai jos:
Dupa cum putem vedea acest mesaj nu este atat de descriptiv pe cat am vrea. Daca insa folosim createMock(String name, Class claz), si mapam clasa pe un anumit nume, obtinem ceva asemanator imaginii de mai jos:
Bucata de cod din imaginea de mai jos deschide o conexiune HTTP catre un anumit URL si citeste continutul acelui URL. Sa presupunem ca acest cod este o metoda a unei aplicatii mai mari pe care vrem sa o testam.
Figura 6 WebClient class
In figura de mai sus:
- Am deschis o conexiune HTTP (1)
- Am citit tot continutul care este primit (2)
- Daca are loc o eroare, returnam null (3)
Ce vrem sa testam este metoda getContent a WebClient. Pentru asta, trebuie sa imitam toate dependencies pe acea metoda. In acest exemplu avem doua dependencies— una este ConnectionFactory si cealalta InputStream. Pare ca este o problem deoarece EasyMock poate sa imite doar interfete si InputStream este o clasa.
Pentru a putea sa imitam clasa InputStream avem nevoie sa folosim class extensions ale EasyMock. Acestea reprezinta un proiect de extensie al EasyMock care ne lasa sa generam mock objects pentru clase si interfete. Acestea sunt adresate de a doua Maven dependency din figura 1 prezentata in articolul anterior.
Figura 7 Testarea WebClient cu EasyMock
In figura 7 facem urmatoarele lucruri:
- Incepem prin a importa obiectele de care avem nevoie (1). Pentru ca folosim class extensions ale EasyMock, trebuie sa importam obiectul org.easymock.classextension.EasyMock in loc de org.easymock.EasyMock. Acum suntem gata sa creeam mock objects ale claselor si interfetelor folosind metodele importate static ale class extensions.
- La (2), exact ca in figurile anterioare, declaram obiectele pe care vrem sa le imitam, si la (3) apelam metoda createMock pentru a le initializa.
- La (4) definim rezultatul stream-ului cand metoda read este invocata (ca sa incetam sa mai analizam stream-ul, ultimul lucru care trebuie sa apara este -1). Daca lucram cu un stream low-level, trebuie sa definim cum citim un byte pe rand, deoarece InputStream citeste byte cu byte. La (5) ne asteptam ca metoda close sa fie apelata pe stream.
- Acum trebuie sa indicam ca am terminat prin declararea asteptarilor noastre – facem asta prin apelarea metodei replay (6). Metoda replay este folosita pentru a transmite mock-ul de la etapa unde inregistram metoda care asteptam sa fie apelata, la etapa unde testam. Inainte de asta, am inregistrat comportamentul, dar obiectul nu merge ca mock. Dupa ce am apelat replay, functioneaza dupa cum ne-am asteptat. Mai avem apoi invocarea metodei pe care o testam (7), si afirmarea rezultatului asteptat (8).
Mai adaugam si un alt test pentru a simula o situatie in care nu putem inchide InputStream.
- Definim o situatie unde ne asteptam ca metoda close a stream-ului sa fie invocata (9).
- Pe urmatoare linie de cod declaram ca o IOException ar trebui sa fie generata daca se intampla asta (10).
Concluzii
In acest articol am discutat despre pasi necesari pentru a testa o aplicatie Java cu ajutorul JUnit 5 si EasyMock. Am aratat cum sa testam functionalitatea AccountService imitand AccountManager si cum sa testam functionalitatea unui WebClient imitand ConnectionFactory si InputStream.
Dupa cum sugereaza si numele acestui framework, este usor sa folosim EasyMock, si este o optiune pentru multe proiecte. Dar ca sa ai o privire de ansamblu cat mai clara trebuie sa discutam si despre un alt framework din cele 3: EasyMock, JMock and Mockito. Astfel ai toate informatiile de care ai nevoie.
Vrei sa inveti mai multe despre aceasta tehnologie? Descopera cursurile noastre.
Catalin Tudose
Java and Web Technologies Expert