Tests et moqueurs unitaires à Java avec Junit 5 et Mockito
Jul 29, 2025 am 01:20 AMUtilisez JUnit 5 et Mockito pour isoler efficacement les dépendances pour les tests unitaires. 1. Créer des objets simulés via @Mock, @InjectMocks Inject L'instance testée, @ExtendWith Activer la Mockito Extension; 2. Utiliser quand (). ThereTreturn () pour définir le comportement de simulation, vérifiez () pour vérifier le nombre d'appels et de paramètres de méthode; 3. Peut simuler les scénarios d'exception et vérifier la gestion des erreurs; 4. Recommander l'injection du constructeur, éviter une sur-simulation et maintenir l'atomicité des tests; 5. Utiliser Asssertall () pour fusionner les affirmations, et @nest organise des scénarios de test pour améliorer la maintenabilité et la fiabilité des tests.
Les tests unitaires et la moquerie sont des moyens importants pour garantir la qualité du code en Java, et Junit 5 et Mockito sont la combinaison la plus populaire de cadres de test. Ils travaillent ensemble pour isoler efficacement la logique commerciale, en particulier pour les scénarios qui reposent sur des services externes, des bases de données ou des objets complexes.

Pourquoi utiliser Junit 5 Mockito?
JUnit 5 est un cadre de test unitaire grand public en Java, offrant des modèles d'annotation plus flexibles, des mécanismes d'extension et des fonctions d'assertion. Mockito est un framework moqueur puissant qui vous permet de créer et de configurer des objets "faux" pour remplacer les dépendances réelles, en vous concentrant ainsi sur le test du comportement des classes cibles.
La combinaison des deux vous permettra de:

- Isoler le code testé à partir des dépendances externes
- Vérifiez le nombre d'appels et de paramètres de méthode
- Simuler des exceptions et des conditions aux limites
- Améliorer la maintenabilité des tests et la vitesse d'exécution
1. Construction de l'environnement de base
Assurez-vous d'abord que le projet présente les dépendances JUnit 5 et Mockito. Si vous utilisez Maven, ajoutez ce qui suit à pom.xml
:
<dépendances> <! - Junit 5 -> <dépendance> <groupId> org.junit.jupiter </rompgroud> <ArtefactId> JUnit-Jupiter </ ArfactId> <version> 5.10.0 </ version> <ccope> Test </ccope> </Dependance> <! - Mockito -> <dépendance> <groupId> org.mockito </rombandid> <ArtefactId> Mockito-core </letefactive> <version> 5.7.0 </ version> <ccope> Test </ccope> </Dependance> <! - Prise en charge de Mockito Junit Jupiter (facultatif, utilisé pour l'initialisation automatique de l'annotation @mock) -> <dépendance> <groupId> org.mockito </rombandid> <ArtefactId> mockito-junit-jupiter </ arfactive> <version> 5.7.0 </ version> <ccope> Test </ccope> </Dependance> </DENDENDENCES>
Assurez-vous également d'utiliser une configuration de build qui prend en charge JUnit 5 (tel que SureFire Plugin version> = 2.22.0).

2. Utilisez Mockito pour simuler les objets de dépendance
Supposons que nous ayons un service d'ordre de service OrderService
qui repose sur une interface de paiement de paiement PaymentGateway
passerelle:
Interface publique Paymentgateway { Charge booléenne (double montant); } classe publique OrderService { PAYS PAYS PAYS PAYSGATE PAYSGATEWAY; ORDERSERVICE PUBLIQUE (PAYSGATEWAY PAYSGATEWAY) { this.paymentgateway = PaymentGateway; } Public Boolean Processorder (double quantité) { if (montant <= 0) renvoie false; Retour PaymentGateway.Charger (montant); } }
Nous voulons tester OrderService.processOrder()
mais ne voulons pas appeler réellement le système de paiement. Pour le moment, vous pouvez utiliser Mockito pour créer un PaymentGateway
simulé.
écrire des classes de test
import org.junit.jupiter.api.test; import org.mockito.injectmocks; import org.mockito.mock; Importer Static org.junit.jupiter.api.Assesertions. *; importer statique org.mockito.mockito. *; classe OrderServiceTest { @Se moquer PAYS PAYSGATE PAYS PAYSGATEWAY; @Injectmocks Commande d'ordre privé; // doit coopérer avec MockitoExtension pour initialiser automatiquement @Mock et @InjectMocks @ org.junit.jupiter.api.extension.extendWith (mockitoextension.class) classe statique imbriquée {} @Test void doit-ilturfalse_whenamountisinvalid () { // appelle la méthode sous test booléen result = orderservice.processOrder (-100); // Affirmer le résultat AssertFalse (résultat); // Vérifiez que la passerelle de paiement n'est pas appelée vérification (PaymentGateway, jamais ()). Charge (anyDouble ()); } @Test void doit-onTrue_WhenPaymentsUCceeds () { // Simuler le comportement de dépendance lorsque (PAYSGATEWAY.CHARGE (100.0)). ThereAtturn (true); // Exécuter Boolean Result = OrderService.ProcessOrder (100.0); // affirmer AssertTrue (résultat); Vérifier (PAYSGATEWAY) .Charger (100.0); } @Test void doit-onTurnfalse_WhenPaymentFails () { quand (PaymentGateway.Charger (100.0)). ThereAtturn (false); Résultat booléen = OrderService.ProcessOrder (100,0); AssertFalse (résultat); Vérifier (PAYSGATEWAY) .Charger (100.0); } }
Description des points clés:
-
@Mock
: Créez un objet simulé (Mock) -
@InjectMocks
: créez une instance de classe cible et injectez automatiquement les champs@Mock
étiquetés (via le constructeur ou l'injection de champ) -
@ExtendWith(MockitoExtension.class)
: Activez l'extension Junit de Mockito pour initialiser automatiquement les annotations -
when(...).thenReturn(...)
: Définissez la valeur de retour de la méthode de simulation -
verify(...)
: Vérifiez si une méthode a été appelée, ainsi que le nombre d'appels, de paramètres, etc.
3. Vérification du comportement
En plus d'affirmer la valeur de retour, vous pouvez également vérifier que la méthode est appelée correctement. Par exemple:
@Test vide doit être titulaire de bord quand (PaymentGateway.Charger (50.0)). ThereAtturn (true); ORDERSERVICE.PROCESSORSE (50.0); // Vérifiez que la méthode de charge est appelée une fois et que le paramètre est 50.0 Vérifier (PaymentGateway, Times (1)). Charge (Eq (50.0)); }
Autres méthodes de vérification courantes:
-
never()
: jamais appelé -
atLeastOnce()
: au moins une fois -
timeout(100)
: appelé dans un délai spécifié (pour asynchrone) -
inOrder(...)
: Vérifiez l'ordre d'appel
// Exemple: vérifiez l'ordre d'appel inOrder inOrder = inOrder (PaymentGateway); inOrder.Verify (PaymentGateway) .Charger (30.0); inOrder.Verify (PaymentGateway) .Charger (20.0);
4. Gérer les exceptions et les situations de limite
Vous pouvez avoir les exceptions de lancement d'objet simulé et tester la logique de gestion des erreurs:
@Test void sihandlepaymentFailureDueToException () { quand (PaymentGateway.Charger (100.0)). ThentHrow (nouveau RuntimeException ("Erreur de réseau")); assertThrows (runtimeException.class, () -> { OrderService.ProcessOrder (100.0); }); Vérifier (PAYSGATEWAY) .Charger (100.0); }
Vous pouvez également utiliser doThrow()
pour coopérer avec doReturn()
pour gérer des méthodes void
ou des scénarios spéciaux.
5. Conseils et meilleures pratiques
- évitez la suresimulation : simulez uniquement les dépendances qui ont vraiment besoin d'isolement et ne simulez pas l'intégralité du lien
- Injection de constructeur préférée : des objets simulés faciles à passer pendant les tests
- Maintenir l'atomicité du test : un test valide uniquement un comportement
- Affirmation par lots utilisant
assertAll()
@Test void multipleassertions () { Quand (Paytgateway.Charger (100.0)). ThereAtturn (true); Résultat booléen = OrderService.ProcessOrder (100,0); Assertall ( () -> assertTrue (résultat), () -> Vérifier (PaymentGateway) .Charger (100.0) )); }
- Utilisez la classe de test
@Nested
pour organiser différents scénarios:
@Nest classe WhenamountIspositive { @Test VOID SOUHNACHARGEPAYMENTGATEWAY () {...} }
Fondamentalement, c'est tout. La combinaison de Junit 5 Mockito rend les tests unitaires Java intuitifs et puissants. La clé est de comprendre le ?comportement de test? plut?t que la ?mise en ?uvre du test? et de contr?ler les dépendances via Mock pour s'assurer que le test est rapide, stable et reproductible.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Le chargement paresseux uniquement les requêtes lors de l'accès aux associations peut facilement entra?ner des problèmes n 1, ce qui convient aux scénarios où les données associées ne sont pas déterminées si elles sont nécessaires; 2. Utilisations de chargement d'urgence avec () pour charger les données associées à l'avance pour éviter N 1 requêtes, ce qui convient aux scénarios de traitement par lots; 3. Le chargement d'urgence doit être utilisé pour optimiser les performances, et n 1 des problèmes peuvent être détectés via des outils tels que Laraveldebugbar, et le $ avec l'attribut du modèle est soigneusement utilisé pour éviter les frais généraux de performances inutiles.

UseArestapitobridgePhpandmlModelsByrunningTheModelinpythonviaflaskorfastapiandCallingitfrompsingCurlorBuzzle.2.Runpythonscripts est ventilateur

Laravel prend en charge l'utilisation des requêtes SQL natives, mais la liaison des paramètres doit être préférée pour assurer la sécurité; 1. Utilisez DB :: SELECT () pour exécuter SELECT Queries avec la liaison des paramètres pour empêcher l'injection SQL; 2. Utilisez DB :: Update () pour effectuer des opérations de mise à jour et renvoyer le nombre de lignes affectées; 3. Utilisez db :: insert () pour insérer des données; 4. Utilisez DB :: Delete () pour supprimer les données; 5. Utilisez DB :: Instruction () pour exécuter des instructions SQL sans ensembles de résultats tels que Create, Alter, etc.; 6. Il est recommandé d'utiliser Whereraw, Selectraw et d'autres méthodes dans QueryBuilder pour combiner les expressions natives pour améliorer la sécurité

La programmation réactive met en ?uvre des services de non-blocage à faible latence et à faible latence en Java via Projectaactor et SpringWebflux. 1. ProjectAacteur fournit deux types de noyaux: mono et flux, prend en charge le traitement déclaratif des flux de données asynchrones et convertis, filtres et autres opérations via des cha?nes d'opérateurs; 2. SpringWebflux est construit sur Reactor, prend en charge deux modèles de programmation: l'annotation et fonctionnelle. Il fonctionne sur des serveurs non bloquants tels que Netty et peut gérer efficacement un grand nombre de connexions simultanées; 3. L'utilisation du réacteur WebFlux peut améliorer la capacité de concurrence et l'utilisation des ressources dans les scénarios à forte intensité d'E / S et prend naturellement SSE et WebSO.

JWT est une norme ouverte pour une transmission s?re d'informations. En Java, l'authentification et l'autorisation peuvent être réalisées via la bibliothèque JJWT. 1. Ajouter des dépendances JJWT API, ILT et Jackson; 2. Créez une classe d'outils JWTutil pour générer, analyser et vérifier les jetons; 3. écrivez JWTFilter intercepte les demandes et vérifiez les Bearertokens dans l'en-tête d'autorisation; 4. Enregistrer le filtre à Springboot pour protéger le chemin spécifié; 5. Fournir une interface de connexion pour renvoyer JWT après la vérification de l'utilisateur; 6. L'interface protégée obtient l'identité et les r?les de l'utilisateur en analysant le jeton pour le contr?le d'accès, et réalise finalement un mécanisme de sécurité apatride et extensible, adapté aux systèmes distribués.

Les génériques GO sont pris en charge depuis 1.18 et sont utilisés pour écrire du code générique pour le type de type. 1. La fonction générique imprimslice [tany] (s [] t) peut imprimer des tranches de tout type, telles que [] int ou [] cha?ne. 2. Grace au nombre de contraintes de type, les limites des types numériques tels que int et float, sum [tnumber] (tranche [] t) t La sommation s?re est réalisée. 3. La bo?te de type générique de structure [tany] struct {Valuet} peut encapsuler n'importe quelle valeur de type et être utilisée avec le constructeur newbox [tany] (VT) * Box [t]. 4. Ajouter SET (VT) et Get () T Méthodes T à boxer [t] sans

Table-Layout: Fixe obligera la largeur de la colonne de table à déterminer par la largeur de la cellule de la première ligne pour éviter le contenu affectant la disposition. 1. Définissez la table de table: fixe et spécifiez la largeur du tableau; 2. Définissez le rapport de largeur de colonne spécifique pour la première ligne th / td; 3. Utilisez White-Space: Nowrap, débordement: Hidden et Text-Overflow: EllipSis pour contr?ler le débordement du texte; 4. Applicable à la gestion des antécédents, aux rapports de données et à d'autres scénarios qui nécessitent une disposition stable et un rendu haute performance, qui peuvent effectivement empêcher la gigue de mise en page et améliorer l'efficacité du rendu.

Utilisez JUnit5 et Mockito pour isoler efficacement les dépendances pour les tests unitaires. 1. Créez un objet simulé via @Mock, @InjectMocks Inject L'instance testée, @ExtendWith Activer la Mockito Extension; 2. Utiliser quand (). ThereraTurn () pour définir le comportement de simulation, vérifiez () pour vérifier le nombre d'appels et de paramètres de méthode; 3. Peut simuler les scénarios d'exception et vérifier la gestion des erreurs; 4. Recommander l'injection du constructeur, éviter une sur-simulation et maintenir l'atomicité des tests; 5. Utiliser Asssertall () pour fusionner les affirmations, et @nest organise les scénarios de test pour améliorer la maintenabilité et la fiabilité des tests.
