Ceci est une note personnelle que j’ai décidé de partager. Elle reflète ma compréhension d’un sujet et peut contenir des erreurs et des approximations. N’hésitez pas à contribuer en me contactant ici. Toute aide sera créditée !


Depuis Spring Boot 3.4.0, les annotations @MockBean et @SpyBean de spring-boot-test sont dépréciées (#39860). Elles sont remplacées par les annotations @MockitoBean et @MockitoSpyBean de spring-test.

Bean Overriding dans les Tests

L’équipe Spring décourage les développeurs d’utiliser le mécanisme de bean overriding (surcharge de bean). Dans Spring Boot 2.1, le bean overriding a été désactivé par défaut. Cependant, dans les tests d’intégration, les développeurs peuvent avoir besoin de remplacer certains beans dans l’ApplicationContext, soit pour les mocker, soit pour fournir une implémentation différente.

Dans Spring Framework 6.2, les développeurs ont implémenté un mécanisme pour remplacer les beans dans les tests d’intégration.

Deux implémentations de ce mécanisme de Bean Overriding sont fournies :

  • Une annotation générique @TestBean qui permet le remplacement d’un bean avec une méthode factory statique sans argument.
  • Une implémentation basée sur Mockito avec deux annotations @MockitoBean et @MockitoSpyBean.

Le mécanisme de remplacement de beans peut être étendu avec des implémentations personnalisées (comme expliqué à la fin de cet article de blog).

@MockitoBean et @MockitoSpyBean

Les deux annotations remplaceront @MockBean et @SpyBean. Cependant, elles n’offrent pas les mêmes fonctionnalités.

Par exemple :

  • @MockitoBean n’est pas supportée sur les classes @Configuration contrairement à @MockBean (#33934).
  • @MockitoBean n’est pas supportée dans les classes @Component contrairement à @MockBean (#34415).

Cependant, l’équipe Spring continue d’améliorer les nouvelles annotations avec des fonctionnalités existantes de @MockBean. Par exemple, ils ont ajouté le support de @Primary (#33819), le support de @MockitoBean au niveau de la classe (#33925)…

Les deux ensembles d’annotations s’appuient sur BeanFactoryPostProcessor pour enregistrer et override les définitions de beans dans le contexte Spring.

⚠ Annotations de mock et contexte Spring dans les tests
Comme @MockBean et @SpyBean, les nouvelles annotations modifient l’ApplicationContext pour remplacer les beans. Ainsi, il n’y a pas eu d’amélioration dans la gestion du cache du contexte. Le contexte Spring ne peut pas être mis en cache entre les tests qui ne partagent pas les mêmes mocks.

Conclusion

Spring offre désormais une manière extensible et unifiée de remplacer les beans dans les tests directement dans le framework Spring (et non plus dans Spring Boot).

Comme expliqué par l’équipe, @MockitoBean et @MockitoSpyBean ne sont pas un “simple remplacement 1 pour 1” de @MockBean et @SpyBean. Bien que des différences subsistent, l’équipe Spring intègre activement les retours de la communauté pour améliorer les nouvelles annotations.

Références