Il y a quelques jours, j’ai onboardé un nouveau développeur sur un projet Spring Boot qui a un coverage de test à 80%. N’ayant pas énormément d’expérience avec les tests d’intégration, j’ai pris le temps de lui expliquer la différence entre l’annotation @Mock de Mockito et @MockBean de Spring Boot, je vais donc en profiter pour résumer ça dans une brève.
Que ce soit @Mock ou @MockBean, les deux annotations permettent de mocker le comportement de vos services ou composants Spring.
Note : Mocker, c’est faker le comportement d’un service afin de borner le scope du test que vous réalisez. Par exemple, si vous testez le OrderService, qui a pour dépendance le PaymentService (qui fait appel à une librairie externe comme Stripe), vous pouvez mocker le comportement du PaymentService pour ne pas avoir à le tester en même temps que le OrderService (et aussi, parce que vous ne pouvez pas vous permettre de requêter votre librairie externe pendant vos tests).
Donc, @Mock et @MockBean permettent de mocker, mais dans deux contextes différents.
Pour faire simple, je vais être réducteur et dire que @Mock permet de mocker une dépendance dans le cadre d’un test unitaire alors que @MockBean permet de mocker une dépendance dans le cadre d’un test d’intégration.
Disons que vous testiez unitairement la méthode order de l’OrderService qui permet de passer une commande. Voilà à quoi ressemblerait le setup de votre test :
Dans un test unitaire, on instancie nous même le service qu’on teste, grâce à son constructeur, ce qui nous permet de lui donner ses dépendances qu’on a mocké. C’est le cas simple, et on peut se servir du mock dans le test pour définir le comportement que la méthode doit avoir.
Disons maintenant que vous testiez la méthode order de l’OrderService dans le cadre d’un test d’intégration, voilà globalement à quoi ressemblerait le setup de votre test :
Ici, on voit bien que ce n’est pas nous qui créons l’instance de notre service (il n’y a pas de new OrderService()). C’est Spring qui va chercher à l’instancier lors du lancement de l’application de test. Par conséquent, comment faire pour dire à Spring que nous souhaitons utiliser un mock, et non une vraie instance du service ?
Eh bien c’est aussi simple que d’annoter le service par @MockBean, qui est une annotation fournie par Spring, et qui va demander à Spring d’instancier l’OrderService en lui donnant notre mock.
Pour tout savoir sur Java, je vous invite à lire notre toute première brève.
Publié le 15/03/2021 dans Développement
Rédigé par :