Testarea aplicatiilor cu JUnit 5 si Mockito. Prima parte

Sunt o multitudine de proiecte bune care sunt deja dezvoltate pentru a ne ajuta sa folosim mock objects in proiectele noastre Java. In aceasta serie de articole ne vom uita in detaliu la trei dintre cele mai folosite frameworkuri: EasyMock, JMock si Mockito. In acest articol vom discuta despre Mockito.

Dec 8, 2020 271

1. Cum folosim Mockito


Stim deja cum sa lucram cu EasyMock si JMock. Acum hai sa vedem cum sa folosim frameworkul Mockito (https://site.mockito.org/). Pentru a putea sa lucram cu Mockito, trebuie sa adaugam dependency de mai jos in fisierul pom.xml:

Mockito Maven dependency 1.JPG


Imaginea de mai jos ne arata un obiect Account foarte simplu care are 2 proprietati: un account ID si un sold.

The Account class 2.JPG


In imaginea de mai jos avem interfata AccountManager care controleaza ciclul de viata si persistenta obiectelor Account (limitate la identificarea de conturi in functie de ID si actualizarea acestora):

AccountManager interface 3.JPG



In imaginea de mai jos avem metoda transfer construita pentru a transfera bani intre doua conturi. Foloseste interfata AccountManager definita anterior pentru a gasi conturile de debit si credit in functie de ID si pentru a le actualiza.

AccountService class 4.JPG


Vrem sa putem face un unit test asupra comportamentului AccountService.transfer. Pentru asta, pana cand implementarea interfetei AccountManager este gata, vom folosi o implementare mock a interfetei AccountManager deoarece metoda de transfer foloseste aceasta interfata si trebuie sa o testam izolat.

Creem testul TestAccountService folosind Mockito, exact ca in figura de mai jos.

TestAccountService class 5.JPG


In imaginea de mai sus facem urmatoarele lucruri:

  1. Ca de obicei, incepem prin a importa toate obiectele de care avem nevoie (1). Acest exemplu care foloseste framework-ul Mockito nu se bazeaza pe static import features.
  2. Extindem acest test folosind MockitoExtension (2). @ExtendWith este o adnotare repetabila care este folosita pentru a inregistra extensii pentru test call adnotata sau test method. Pentru acest exemplu cu Mockito, vom nota doar faptul ca aceasta extensie este folosita pentru a crea mock objects prin adnotari, asa cum facem la punctul (3). Asta ii spune lui Mockito sa creeze un mock object de tipul AccountManager.
  3. Exact ca in cazul EasyMock sau JMock declaram doua conturi pe care le vom folosi pentru a transfera bani (4).
  4. La punctul (5) incepem sa declaram asteptarile, folosind metoda when. Aditional folosim metoda lenient pentru a modifica strictetea objects mocking. Fara asta, este permisa doar declararea unei singure asteptari pentru aceeasi metoda findAccountForUser, dar avem nevoie de doua (una pentru argumentul “1” si una pentru argumentul “2”).
  5. La (6) incepem transferul de la un cont la altul, si dupa asta definim rezultatele la care ne asteptam (7).

Codul de mai jo deschide o conexiune HTTP catre un URL dat si citeste continutul de la acel URL. Sa presupunem ca acest cod este o metoda a unei aplicatii mai mari careia vrem sa ii facem unit test.

WebClient class 6.JPG


In codul de mai sus:
  • Deschidem o conexiune HTTP (1).
  • Citim continutul care este primit (2).
  • Daca o eroare are loc, generam null (3).

Ce vrem sa testam este metoda getContent a WebClient. Pentru asta, trebuie sa facem mock pentru toate dependencies ale acestei metode. In acest exemplu avem doua dependencies—una este ConnectionFactory si cealalta InputStream. Folosind modelul din cazul EasyMock sau JMock, hi sa aratam testul WebClient, de data asta folosind Mockito.

Vrei sa inveti mai multe despre aceasta tehnologie? Descopera cursurile noastre.

Catalin Tudose
Java and Web Technologies Expert

Daca iti place acest articol, distribuie-l si prietenilor tai!




Mai ai intrebari?
Contacteaza-ne.
Thank you.
Your request has been received.