Lo scopo di un test unitario è identificare gli errori in un'applicazione il prima possibile. Sebbene diversi canali possano condurti allo stesso obiettivo, dovresti mirare a utilizzare il percorso più efficiente.
Una suite di test JUnit potrebbe avere diverse classi di test che richiedono gli stessi dati, ma non è possibile riutilizzare i dati di test. Nelle versioni precedenti di JUnit, un buon approccio era quello di creare un metodo di utilità, quindi chiamare quel metodo ogni volta che una classe di test necessitava dei suoi dati.
JUnit 5 fornisce un approccio più efficiente a questo problema: dependency injection (DI).
Cos'è l'iniezione di dipendenza?
DI è un modello di progettazione in cui un oggetto fornisce le dipendenze di un altro oggetto. Quando crei un'applicazione Java, potresti avere una classe che dipende da un oggetto creato da un'altra classe per svolgere la sua funzione.
Prima dell'iniezione di dipendenza, per utilizzare un oggetto di una classe diversa dovresti creare una nuova istanza di quell'oggetto all'interno della classe che dipende da esso. Quindi, se avessi diverse classi che dipendono dallo stesso oggetto, dovresti crearne diverse istanze all'interno delle classi dipendenti.
DI consente di utilizzare un oggetto in una classe dipendente, senza crearne una nuova istanza in tale classe.
Iniezione di dipendenze in JUnit 5
JUnit 5 consente di inserire dipendenze sia nei metodi di test che nei costruttori. Ciò è significativo in quanto le versioni precedenti del framework non consentivano ai metodi di test o ai costruttori di avere parametri.
JUnit 5 ti consente di iniettare tutti i parametri che desideri. L'unico problema è che l'API ParameterResolver deve essere in grado di risolvere ogni parametro in fase di esecuzione. JUnit dispone attualmente di tre risolutori di parametri incorporati che utilizza automaticamente. Per utilizzare qualsiasi altro resolver, è necessario registrarlo in modo esplicito utilizzando l'annotazione @ExtendWith.
Iniezione di dipendenze in JUnit
Questo programma di esempio utilizza uno dei parametri incorporati di JUnit (il TestInfoParameterResolver), per dimostrare come è possibile inserire una dipendenza in un Test JUnit 5. Il TestInfoParameterResolver risolve gli oggetti che appartengono all'interfaccia TestInfo. Pertanto, JUnit 5 fornirà un'istanza dell'interfaccia TestInfo a qualsiasi metodo o costruttore che la utilizza.
importarestatico org.junit.jupiter.api. Asserzioni.*;
importare org.junit.jupiter.api. Nome da visualizzare;
importare org.junit.jupiter.api. Test;
importare org.junit.jupiter.api. TestInfo;classeInfoTestInterfaceTest{
// Inserimento di un oggetto testInfo nel costruttore InfoTestInterfaceTest
InfoTestInterfaceTest (TestInfo testInfo) {
assertEquals("InfoTestInterfaceTest", testInfo.getDisplayName());
}// Inserimento di un oggetto testInfo nei metodi
@Test
vuototestMetodoNome(TestInfo testInfo){
assertEquals("testMethodName (TestInfo)", testInfo.getDisplayName());
}
@Test
@Nome da visualizzare("metodo che utilizza il @Nome da visualizzare annotazione")
vuototestMetodoNomeDue(TestInfo testInfo){
assertEquals("metodo che utilizza il @Nome da visualizzare annotazione", testInfo.getDisplayName());
}
}
Il test JUnit sopra mostra come inserire un oggetto in un costruttore e due metodi. IL JUnit TestInfo interface ha quattro metodi che puoi usare con il suo oggetto.
Il metodo getDisplayName() è il più utile. Restituisce il nome visualizzato del metodo o del costruttore di test corrente. Per impostazione predefinita, questo nome è basato sulla classe. Ma se usi l'annotazione @DisplayName, il metodo getDisplayName() restituirà invece quel testo.
La classe di test sopra genera il seguente rapporto di test:
Utilizzare DI nei metodi @Before e @After
Esistono altri quattro tipi di metodi annotati JUnit che supportano le dipendenze. Queste sono le annotazioni @BeforeAll, @BeforeEach, @AfterAll e @AfterEach. Come il metodo @Test, tutto ciò che devi fare è passare un oggetto a uno qualsiasi dei metodi before o after come parametro e sei a posto.
Le annotazioni @Before e @After sono importanti, poiché aiutano anche a sviluppare un codice di test più efficiente. Avere la possibilità di inserire anche dipendenze in questi metodi migliorerà ulteriormente il codice di test.