Scopul unui test unitar este de a identifica erorile dintr-o aplicație cât mai curând posibil. Deși mai multe canale te pot conduce la același obiectiv, ar trebui să încerci să folosești cea mai eficientă rută.
O suită de teste JUnit poate avea mai multe clase de testare care au nevoie de aceleași date, dar nu puteți reutiliza datele de testare. În versiunile anterioare ale JUnit, o abordare bună era crearea unei metode utilitare, apoi apelarea acelei metode de fiecare dată când o clasă de test avea nevoie de datele sale.
JUnit 5 oferă o abordare mai eficientă a acestei probleme: injecția de dependență (DI).
Ce este injecția de dependență?
DI este un model de proiectare în care un obiect furnizează dependențele altui obiect. Când construiți o aplicație Java, este posibil să aveți o clasă care depinde de un obiect pe care îl creează o altă clasă pentru a-și îndeplini funcția.
Înainte de injectarea dependenței, pentru a utiliza un obiect dintr-o clasă diferită, ar trebui să creați o nouă instanță a acelui obiect în cadrul clasei care depinde de el. Deci, dacă aveți mai multe clase care depind de același obiect, ar trebui să creați mai multe instanțe ale acestuia în cadrul claselor dependente.
DI vă permite să utilizați un obiect dintr-o clasă dependentă, fără a crea o nouă instanță a acestuia în acea clasă.
Injecția de dependență în JUnit 5
JUnit 5 vă permite să injectați dependențe atât în metodele de testare, cât și în constructori. Acest lucru este semnificativ deoarece versiunile anterioare ale cadrului nu permiteau metodelor de testare sau constructorilor să aibă parametri.
JUnit 5 vă permite să injectați oricât de mulți parametri doriți. Singura problemă este că API-ul ParameterResolver trebuie să poată rezolva fiecare parametru în timpul execuției. JUnit are în prezent trei solutoare de parametri încorporate pe care le folosește automat. Pentru a utiliza orice alt rezolutor, ar trebui să îl înregistrați în mod explicit utilizând adnotarea @ExtendWith.
Injectarea dependențelor în JUnit
Acest exemplu de program folosește unul dintre parametrii încorporați ai JUnit (TestInfoParameterResolver), pentru a demonstra cum puteți injecta o dependență într-un Testul JUnit 5. TestInfoParameterResolver rezolvă obiectele care aparțin interfeței TestInfo. Deci, JUnit 5 va furniza o instanță a interfeței TestInfo oricărei metode sau constructor care o folosește.
importstatic org.junit.jupiter.api. Aserțiuni.*;
import org.junit.jupiter.api. Numele de afișare;
import org.junit.jupiter.api. Test;
import org.junit.jupiter.api. TestInfo;clasăInfoTestInterfaceTest{
// Injectarea unui obiect testInfo în constructorul InfoTestInterfaceTest
InfoTestInterfaceTest (TestInfo testInfo) {
assertEquals("InfoTestInterfaceTest", testInfo.getDisplayName());
}// Injectarea unui obiect testInfo în metode
@Test
goltestMethodName(TestInfo testInfo){
assertEquals("testMethodName (TestInfo)", testInfo.getDisplayName());
}
@Test
@Numele de afișare("metoda folosind @Numele de afișare adnotare")
goltestMethodNameTwo(TestInfo testInfo){
assertEquals("metoda folosind @Numele de afișare adnotare", testInfo.getDisplayName());
}
}
Testul JUnit de mai sus demonstrează cum să injectați un obiect într-un constructor și două metode. The JUnit TestInfo interfața are patru metode pe care le puteți utiliza cu obiectul său.
Metoda getDisplayName() este cea mai utilă. Returnează numele afișat al metodei de testare sau al constructorului curent. În mod implicit, acest nume se bazează pe clasă. Dar dacă folosești adnotarea @DisplayName, metoda getDisplayName() va returna acel text.
Clasa de testare de mai sus generează următorul raport de testare:
Utilizați DI în metodele @Before și @After
Există alte patru tipuri de metode adnotate JUnit care acceptă dependențe. Acestea sunt adnotările @BeforeAll, @BeforeEach, @AfterAll și @AfterEach. La fel ca metoda @Test, tot ce trebuie să faceți este să treceți un obiect la oricare dintre metodele înainte sau după ca parametru și sunteți gata.
Adnotările @Before și @After sunt importante, deoarece vă ajută și să dezvoltați un cod de testare mai eficient. Având capacitatea de a injecta dependențe în aceste metode va îmbunătăți și mai mult codul de testare.