Una guida rapida a @DirtiesContext

1. Panoramica

In questo breve tutorial, impareremo a conoscere l' annotazione @DirtiesContext . Mostreremo anche un modo standard per utilizzare l'annotazione per i test.

2. @DirtiesContext

@DirtiesContext è un'annotazione di test di primavera . Indica che il test o la classe associati modifica il ApplicationContext . Indica al framework di test di chiudere e ricreare il contesto per i test successivi.

Possiamo annotare un metodo di test o un'intera classe. Impostando MethodMode o ClassMode , possiamo controllare quando Spring contrassegna il contesto per la chiusura .

Se posizioniamo @DirtiesContext su una classe, l'annotazione si applica a ogni metodo nella classe con il ClassMode specificato.

3. Testare senza chiarire il contesto primaverile

Supponiamo di avere un utente :

public class User { String firstName; String lastName; }

Abbiamo anche una UserCache molto semplice :

@Component public class UserCache { @Getter private Set userList = new HashSet(); public boolean addUser(String user) { return userList.add(user); } public void printUserList(String message) { System.out.println(message + ": " + userList); } }

Creiamo un test di integrazione per caricare e testare l'applicazione completa:

@TestMethodOrder(OrderAnnotation.class) @ExtendWith(SpringExtension.class) @SpringBootTest(classes = SpringDataRestApplication.class) class DirtiesContextIntegrationTest { @Autowired protected UserCache userCache; ... }

Il primo metodo, addJaneDoeAndPrintCache , aggiunge una voce alla cache:

@Test @Order(1) void addJaneDoeAndPrintCache() { userCache.addUser("Jane Doe"); userCache.printUserList("addJaneDoeAndPrintCache"); }

Dopo aver aggiunto un utente alla cache, stampa il contenuto della cache:

addJaneDoeAndPrintCache: [Jane Doe]

Successivamente, printCache stampa nuovamente la cache dell'utente:

@Test @Order(2) void printCache() { userCache.printUserList("printCache"); }

Contiene il nome aggiunto nel test precedente:

printCache: [Jane Doe]

Supponiamo che un test successivo si basi su una cache vuota per alcune asserzioni. I nomi inseriti in precedenza possono causare comportamenti indesiderati.

4. Utilizzo di @DirtiesContext

Ora mostreremo @DirtiesContext con il MethodMode predefinito , AFTER_METHOD . Ciò significa che Spring segnerà il contesto per la chiusura dopo il completamento del metodo di test corrispondente.

Per isolare le modifiche a un test, aggiungiamo @DirtiesContext . Vediamo come funziona.

Il metodo di test addJohnDoeAndPrintCache aggiunge un utente alla cache. Abbiamo anche aggiunto l' annotazione @DirtiesContext , che dice che il contesto dovrebbe chiudersi alla fine del metodo di test:

@DirtiesContext(methodMode = MethodMode.AFTER_METHOD) @Test @Order(3) void addJohnDoeAndPrintCache() { userCache.addUser("John Doe"); userCache.printUserList("addJohnDoeAndPrintCache"); }

L'output è ora:

addJohnDoeAndPrintCache: [John Doe, Jane Doe]

Infine, printCacheAgain stampa di nuovo la cache:

@Test @Order(4) void printCacheAgain() { userCache.printUserList("printCacheAgain"); }

Eseguendo la classe di test completa, vediamo il ricaricamento del contesto Spring tra addJohnDoeAndPrintCache e printCacheAgain . Quindi la cache si reinizializza e l'output è vuoto:

printCacheAgain: []

5. Altre fasi di test supportate

L'esempio sopra mostra la fase del metodo di prova dopo la corrente . Facciamo un breve riassunto delle fasi:

5.1. Livello di classe

Le opzioni ClassMode per una classe di test definiscono quando il contesto viene reimpostato :

  • BEFORE_CLASS: prima della classe di test corrente
  • BEFORE_EACH_TEST_METHOD: prima di ogni metodo di test nella classe di test corrente
  • AFTER_EACH_TEST_METHOD: dopo ogni metodo di test nella classe di test corrente
  • AFTER_CLASS: dopo la classe di test corrente

5.2. Livello del metodo

Le opzioni MethodMode per un singolo metodo definiscono quando il contesto viene reimpostato :

  • BEFORE_METHOD: prima del metodo di prova corrente
  • AFTER_METHOD : dopo il metodo di test corrente

6. Conclusione

In questo articolo, abbiamo presentato l' annotazione di test @DirtiesContext .

Come sempre, il codice di esempio è disponibile su GitHub.