Défi : Tests Unitaires
Tâche
Nous approchons de la fin de ce cours, et pour conclure notre application, il est proposé de terminer l'écriture de tous les tests unitaires pour les couches contrôleur et service.
Explication de la tâche
Il est nécessaire de tester toutes les méthodes dans les couches contrôleur et service qui n'ont pas encore de tests écrits. Pour cela, il est recommandé d'utiliser JUnit avec la bibliothèque Mockito.
Directives pour l'écriture de tests avec JUnit
Voici quelques méthodes clés qui seront utiles :
assertNotNull(result): Vérifie que le résultat d'un appel de méthode n'est pas null, confirmant que l'opération a été réussie ;
assertEquals(expected, actual): Compare la valeur attendue avec la valeur réelle pour vérifier que les données correctes sont retournées ;
assertTrue(condition): Vérifie qu'une condition est vraie, par exemple, s'assurer qu'une liste de livres est vide s'il n'y a aucun enregistrement dans la base de données ;
verify(mock).methodCall(): Vérifie qu'une méthode spécifique sur un objet mocké a été appelée avec les paramètres attendus, validant ainsi l'interaction entre les composants ;
when(mock.methodCall()).thenReturn(value): Configure un mock pour retourner une certaine valeur lorsqu'une méthode est appelée, simulant les dépendances dans les tests.
Test des contrôleurs
Ici, des tests ont déjà été écrits pour les méthodes findAllBooks, findByAuthor, createBook et updateBook. Il vous reste à écrire des tests pour la méthode restante. Vous trouverez ci-dessous quelques conseils pour vous aider à mettre en œuvre le test de cette méthode.
deleteBooks(String id)
Pour la méthode deleteBooks(String id), il est nécessaire de vérifier que la méthode de suppression est appelée avec le bon id et de tester la gestion des erreurs lors de la tentative de suppression d'un livre inexistant. Pour une réponse réussie, vérifiez uniquement le statut ; pour les erreurs, vérifiez à la fois le statut et le message d'erreur.
BookService.java
1234567@Transactional public void deleteBook(String id) { if(!bookRepository.existsById(id)) { throw new ApiException("Not found by id: " + id, HttpStatus.NOT_FOUND); } bookRepository.deleteById(id); }
Pour le contrôleur, il est nécessaire d'écrire deux tests pour cette méthode : un pour la suppression réussie et un autre pour le cas où un 404 status est retourné.
Gardez à l'esprit que la méthode du service que nous allons simuler ne retourne rien, tout comme le contrôleur.
Vous pouvez utiliser la méthode doNothing() pour simuler une méthode void, garantissant qu'aucune action n'est effectuée lors de son invocation. La syntaxe est :
doNothing().when(someService).someVoidMethod();
Lorsque vous devez gérer un scénario où une exception est levée, utilisez doThrow(). Cette méthode de Mockito simule le lancement d'une exception depuis une méthode void. La syntaxe est :
doThrow(new ApiException(messageException, HttpStatus.NOT_FOUND)).when(bookService).deleteBook("1");
Test du service
deleteBook(String id)
La méthode deleteBook(String id) nécessite une validation pour s'assurer que la méthode de suppression du livre est appelée avec le bon id. De plus, il est essentiel de tester la gestion par la méthode de la situation où un livre avec l'id spécifié n'est pas trouvé.
Il faudra implémenter deux tests : un où l'entité est trouvée par id et supprimée, et un autre où une exception est levée.
Que faire si vous ne pouvez pas écrire de tests ?
Il est tout à fait normal de ne pas maîtriser le sujet dès la première tentative ; il peut être nécessaire de relire les concepts de test. Il est également recommandé de consulter la solution de cet exercice.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Can you explain how to write a test for the deleteBook method in the service layer?
What should I focus on when testing the controller's deleteBooks method?
Can you clarify how to use doThrow and doNothing in Mockito for these tests?
Awesome!
Completion rate improved to 3.45
Défi : Tests Unitaires
Glissez pour afficher le menu
Tâche
Nous approchons de la fin de ce cours, et pour conclure notre application, il est proposé de terminer l'écriture de tous les tests unitaires pour les couches contrôleur et service.
Explication de la tâche
Il est nécessaire de tester toutes les méthodes dans les couches contrôleur et service qui n'ont pas encore de tests écrits. Pour cela, il est recommandé d'utiliser JUnit avec la bibliothèque Mockito.
Directives pour l'écriture de tests avec JUnit
Voici quelques méthodes clés qui seront utiles :
assertNotNull(result): Vérifie que le résultat d'un appel de méthode n'est pas null, confirmant que l'opération a été réussie ;
assertEquals(expected, actual): Compare la valeur attendue avec la valeur réelle pour vérifier que les données correctes sont retournées ;
assertTrue(condition): Vérifie qu'une condition est vraie, par exemple, s'assurer qu'une liste de livres est vide s'il n'y a aucun enregistrement dans la base de données ;
verify(mock).methodCall(): Vérifie qu'une méthode spécifique sur un objet mocké a été appelée avec les paramètres attendus, validant ainsi l'interaction entre les composants ;
when(mock.methodCall()).thenReturn(value): Configure un mock pour retourner une certaine valeur lorsqu'une méthode est appelée, simulant les dépendances dans les tests.
Test des contrôleurs
Ici, des tests ont déjà été écrits pour les méthodes findAllBooks, findByAuthor, createBook et updateBook. Il vous reste à écrire des tests pour la méthode restante. Vous trouverez ci-dessous quelques conseils pour vous aider à mettre en œuvre le test de cette méthode.
deleteBooks(String id)
Pour la méthode deleteBooks(String id), il est nécessaire de vérifier que la méthode de suppression est appelée avec le bon id et de tester la gestion des erreurs lors de la tentative de suppression d'un livre inexistant. Pour une réponse réussie, vérifiez uniquement le statut ; pour les erreurs, vérifiez à la fois le statut et le message d'erreur.
BookService.java
1234567@Transactional public void deleteBook(String id) { if(!bookRepository.existsById(id)) { throw new ApiException("Not found by id: " + id, HttpStatus.NOT_FOUND); } bookRepository.deleteById(id); }
Pour le contrôleur, il est nécessaire d'écrire deux tests pour cette méthode : un pour la suppression réussie et un autre pour le cas où un 404 status est retourné.
Gardez à l'esprit que la méthode du service que nous allons simuler ne retourne rien, tout comme le contrôleur.
Vous pouvez utiliser la méthode doNothing() pour simuler une méthode void, garantissant qu'aucune action n'est effectuée lors de son invocation. La syntaxe est :
doNothing().when(someService).someVoidMethod();
Lorsque vous devez gérer un scénario où une exception est levée, utilisez doThrow(). Cette méthode de Mockito simule le lancement d'une exception depuis une méthode void. La syntaxe est :
doThrow(new ApiException(messageException, HttpStatus.NOT_FOUND)).when(bookService).deleteBook("1");
Test du service
deleteBook(String id)
La méthode deleteBook(String id) nécessite une validation pour s'assurer que la méthode de suppression du livre est appelée avec le bon id. De plus, il est essentiel de tester la gestion par la méthode de la situation où un livre avec l'id spécifié n'est pas trouvé.
Il faudra implémenter deux tests : un où l'entité est trouvée par id et supprimée, et un autre où une exception est levée.
Que faire si vous ne pouvez pas écrire de tests ?
Il est tout à fait normal de ne pas maîtriser le sujet dès la première tentative ; il peut être nécessaire de relire les concepts de test. Il est également recommandé de consulter la solution de cet exercice.
Merci pour vos commentaires !