Uneori, apariția unei excepții este comportamentul așteptat al sistemului, iar în timpul testelor este necesar să se verifice dacă acesta are loc într-adevăr.
Următoarele cinci metode descriu modul de interceptare a excepției așteptate în cadrul testului JUnit și testarea proprietăților sale. Primele patru dintre ele pot fi folosite în JUnit 4, iar ultima utilizează noile caracteristici ale JUnit 5.
Ca exemplu de demonstrație, să facem un test pentru funcția bibliotecii standard care creează un fișier temporar. Vom verifica faptul că atunci când încercați să creați un fișier într-un director inexistent, apare o excepție de tip IOException. În acest caz, în același test, un director temporar este creat și șters imediat, astfel încât să obținem un director garantat care nu există, în care încercăm să creăm un fișier:
Desigur, în această formă testul va cădea, iar în raport va fi scris că a existat o excepție. Și avem nevoie ca testul în acest caz să fie marcat cu succes. Să vedem cum poate fi rezolvată această problemă.
Cea mai ușoară modalitate de a spune cadrului de testare că se așteaptă o excepție este să specificați parametrul opțional așteptat în adnotarea @Test:
Acest parametru trebuie să conțină tipul excepției așteptate. Dacă se produce o excepție de acest tip, testul va reuși. Dacă există o excepție de alt tip sau nu apare deloc - testul va cădea.
- Nu puteți verifica textul mesajului sau alte proprietăți ale excepției care a avut loc.
- Este imposibil să înțelegeți exact unde provenea excepția. În exemplul examinat, acesta ar fi putut fi aruncat de o funcție netestată, dar puțin mai devreme, când încerca să creeze un director temporar. Testul nu a putut ajunge la apelul funcției testate - dar în raport este marcat ca reușit!
A doua dintre aceste probleme este atât de groaznică încât nu recomand niciodată această metodă nimănui.
2. încercați-captura
Ambele dezavantaje pot fi eliminate dacă interceptați explicit excepția folosind constructul try-catch:
Dacă excepția survine înainte de încercarea blocului - testul cade, aflăm că are probleme.
Dacă funcția testată nu aruncă deloc nicio excepție - vom cădea în eșec () în linia următoare, testul scade.
Dacă aruncă o excepție de tip necorespunzător - blocul de captură nu îl prinde, testul cade din nou.
Se termină cu succes numai atunci când funcția testată face o excepție de tipul cerut.
Testul a devenit mai fiabil, nu mai pierde bug-uri. Și în blocul de captură, puteți verifica proprietățile excepției prinse.
Cu toate acestea, este incomod să lucrați cu constructul try-catch.
Pentru a scăpa de aceasta, puteți folosi regula ExpectedException. inclus în distribuția standard a JUnit 4:
Acum, codul are o structură plană simplă, deși numărul total de linii de cod, din păcate, a crescut.
Dar principala problemă a acestei metode este că verificările din acest stil arată nefiresc - descrie mai întâi comportamentul și apoi se numește funcția. Desigur, aceasta este o chestiune de gust, dar îmi place când se fac verificări după ce se cheamă funcția de testare.
4. Asigurarea / aruncarea
O metodă mai frumoasă, folosind capabilitățile Java 8, oferă biblioteci suplimentare, cum ar fi AssertJ sau catch-throwable. Iată un exemplu de lucru cu AssertJ:
Și dacă excepția nu apare - "capcana" în sine aruncă o excepție și testul scade.
5. JUnit 5
Dar de ce trebuie să folosiți câteva biblioteci suplimentare, de ce cadrele de testare însăși nu oferă oportunități convenabile pentru a lucra cu excepțiile așteptate?
Sunt deja furnizate. Capturarea excepțiilor în JUnit 5 arată foarte similar cu exemplul anterior:
Anterior, această caracteristică nu era disponibilă în JUnit, deoarece versiunile anterioare ale JUnit erau orientate spre versiuni mai vechi ale Java, unde nu existau expresii lambda și era pur și simplu imposibil să se scrie un astfel de cod. Da, puteți face ceva similar cu clasele anonime, dar se pare atât de groaznic că designul de încercare-prindere pare să fie înălțimea harului.
Deci, dacă trebuie să scrieți teste care verifică excepțiile - este o ocazie să priviți noile caracteristici ale JUnit 5.
Distribuiți pe Twitter Distribuiți pe Facebook Distribuiți pe Google+