Un guide rapide sur @DirtiesContext

1. Vue d'ensemble

Dans ce rapide didacticiel, nous découvrirons l' annotation @DirtiesContext . Nous montrerons également une manière standard d'utiliser l'annotation pour les tests.

2. @DirtiesContext

@DirtiesContext est une annotation de test Spring . Il indique que le test ou la classe associé modifie le ApplicationContext . Il indique au cadre de test de fermer et de recréer le contexte pour les tests ultérieurs.

Nous pouvons annoter une méthode de test ou une classe entière. En définissant MethodMode ou ClassMode , nous pouvons contrôler le moment où Spring marque le contexte pour la fermeture .

Si nous plaçons @DirtiesContext sur une classe, l'annotation s'applique à chaque méthode de la classe avec le ClassMode donné .

3. Tester sans effacer le contexte Spring

Disons que nous avons un utilisateur :

public class User { String firstName; String lastName; }

Nous avons également un UserCache très simple :

@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); } }

Nous créons un test d'intégration pour charger et tester l'application complète:

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

La première méthode, addJaneDoeAndPrintCache , ajoute une entrée au cache:

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

Après avoir ajouté un utilisateur au cache, il imprime le contenu du cache:

addJaneDoeAndPrintCache: [Jane Doe]

Ensuite, printCache imprime à nouveau le cache utilisateur:

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

Il contient le nom ajouté lors du test précédent:

printCache: [Jane Doe]

Disons qu'un test ultérieur reposait sur un cache vide pour certaines assertions. Les noms précédemment insérés peuvent provoquer un comportement indésirable.

4. Utilisation de @DirtiesContext

Nous allons maintenant afficher @DirtiesContext avec le MethodMode par défaut , AFTER_METHOD . Cela signifie que Spring marquera le contexte pour la fermeture une fois la méthode de test correspondante terminée.

Pour isoler les modifications apportées à un test, nous ajoutons @DirtiesContext . Voyons voir comment ça fonctionne.

La méthode de test addJohnDoeAndPrintCache ajoute un utilisateur au cache. Nous avons également ajouté l' annotation @DirtiesContext , qui indique que le contexte doit s'arrêter à la fin de la méthode de test:

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

La sortie est maintenant:

addJohnDoeAndPrintCache: [John Doe, Jane Doe]

Enfin, printCacheAgain imprime à nouveau le cache:

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

En exécutant la classe de test complète, nous voyons le rechargement du contexte Spring entre addJohnDoeAndPrintCache et printCacheAgain . Ainsi, le cache se réinitialise et la sortie est vide:

printCacheAgain: []

5. Autres phases de test prises en charge

L'exemple ci-dessus montre la phase de la méthode de test après courant . Faisons un bref résumé des phases:

5.1. Niveau de classe

Les options ClassMode d'une classe de test définissent le moment où le contexte est réinitialisé :

  • BEFORE_CLASS: avant la classe de test actuelle
  • BEFORE_EACH_TEST_METHOD: avant chaque méthode de test dans la classe de test actuelle
  • AFTER_EACH_TEST_METHOD: après chaque méthode de test dans la classe de test actuelle
  • AFTER_CLASS: Après la classe de test actuelle

5.2. Niveau de méthode

Les options MethodMode d'une méthode individuelle définissent la réinitialisation du contexte :

  • BEFORE_METHOD: avant la méthode de test actuelle
  • AFTER_METHOD : après la méthode de test actuelle

6. Conclusion

Dans cet article, nous avons présenté l' annotation de test @DirtiesContext .

Comme toujours, l'exemple de code est disponible à l'adresse over sur GitHub.