Testarea aplicatiilor cu JUnit5 si JMock 2. Partea a doua

Cea de-a doua parte a articolului nostru despre testarea aplicatiilor cu JUnit5 si JMock.

Nov 18, 2020 246

Prezentare Jmock


Pentru a vedea cum folosim JMock, creeam testul TestAccountService folosind JMock, ca in imaginea de mai jos.

TestAccountService class 1.JPG


In codul respectiv am facut urmatoarele lucruri:

  1. Ca de obicei incepem prin a importa toate obiectele de care avem nevoie (1). Dupa cum puteti vedea, spre deosebire de EasyMock, framework-ul JMock nu se bazeaza pe static import features.
  2. JUnit5 ofera o metoda programatica de a inregistra extensiile. Pentru JMock, acest lucru se face adnotand JUnit5Mockery non-private instance field cu @RegisterExtension. Obiectul Context ne ajuta sa dezvoltam mocks si sa definim asteptarile (2).
  3. La (3) declaram AccountManager pe baza caruia vrem sa facem un mock. Ca EasyMock, JMock framework face doar un mock al interfetei.
  4. In metoda @BeforeEach, care este executata inainte fiecarei metode @Test, creem in mod programatic obiectul mock by prin intermediul obiectului context (4).
  5. Ca in exemplele anterioare, declaram doua conturi intre care vom transfera bani (5).
  6. La (6) incepem sa declaram asteptarile, construind un obiect nou Expectations.
  7. La (7) declaram prima asteptare, fiecare avand forma de mai jos:

expectation 2.JPG


Toate clauzele sunt optionale, cu exceptia celor cu bold - invocation-count & mock-object. Trebuie sa specificam cate invocari vor avea loc si pe ce obiect. Dupa, in cazul in care metoda returneaza un obiect, declaram acel obiect folosind will(returnValue()).

In urma acestui lucru:

La (8) incepem transferul dintr-un cont in altul, si dupa facem assert cu rezultatele asteptate (9). Este atat de simplu!

Dar, ce s-a intamplat cu verificarea invocation count? In toate exemplele anterioare a trebuit sa verificam faptul ca invocarile asteptarilor s-au intamplat de numarul preconizat de ori. Cu JMock nu trebuie sa facem asta – extensiile JMock se ocupa de asta si daca oricare din apelari nu sunt facute, testul esueaza.
Code snippet-ul din imaginea de mai jos deschide o conexiune HTTP catre un URL si citeste continutul de la acel URL. Sa presupunem ca acest cod face parte dintr-o aplicatie mai mare unde vrem sa facem un unit test.

WebClient class 3.JPG


In imaginea de mai sus:
  • Am deschis o conexiune HTTP (1)
  • Am citit tot continutul primit (2)
  • Daca o erore are loc, returnam null (3)

Ce vrem sa testam este metoda getContent a WebClient. Pentru acest scop, trebuie sa facem mock dupa toate dependencies catre acea metoda. In acest exemplu avem doua dependencies – una este ConnectionFactory si cealalta este InputStream. Pe baza acestui pattern cu EasyMock, vom arata cum functioneaza testul WebClient, folosind JMock de aceasta data.

WebClient with JMock 4.jpg


In imaginea de mai sus am facut urmatoarele lucruri:
  1. Incepem test-case-ul inregistrand extensia JMock. Campul context JUnit5Mockery non-private instance este adnotat @RegisterExtension (1).
  2. Pentru a-i spune lui JMock sa dezvolte mock objects nu doar pentru interfete, ci si pentru clase, trebuie sa setam proprietatea imposteriser a contextului (2). Acum putem continua sa creeam mocks asa cum facem in mod normal.
  3. La (3) declaram si initializam programatic cele doua obiecte pe baza carora sa dezvoltam mocks.
  4. La (4) incepem sa declaram asteptarile. Declaram executia consecutiva a metodei read() a stream-ului (5), precum si valorile returnate.
  5. La (6) apelam metoda care este testata si la (7) afirmam rezultatul asteptat.
  6. Pentru o prezentare completa legata de folosirea JMock mocking library, avem si o alta metoda @Test, care testeaza WebClient in conditii exceptionale. La (8) declaram asteptarea metodei close() care este activata si la (9) instruim JMock sa genereze o IOException cand se intampla acest lucru.


Concluzii

In cadrul acestui articol am aratat pasii necesari pentru a testa o aplicatie Java cu ajutorul JUnit 5 si JMock. Am aratat cum sa testam functionalitatea AccountService facand un mock dupa AccountManager si a unui WebClient cu un mock dupa ConnectionFactory si un InputStream.

Dupa cum putem vedea, libraria JMock este la fel de usor de folosit ca cea EasyMock, dar ofera o mai buna integrare cu JUnit 5 – putem sa inregistram programatic campul Mockery context. In urmatorul articol vom analiza cel de-al treilea framework: Mockito. Vei vedea ca este cea mai apropiata de paradigma JUnit 5!

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.