Tester efficacement votre code peut être difficile lorsque certaines parties dépendent d’autres composants non disponibles.
Cette situation complique le processus de test, augmentant les erreurs et les délais de développement.
Découvrez comment les mocks et Mockito peuvent vous aider à simuler des comportements et à structurer vos tests de manière efficace.
Développez des applications Android solides, fiables et efficaces avec une approche TDD
Lorsque vous développez un logiciel, il est souvent nécessaire de tester le code pour s’assurer qu’il fonctionne comme prévu. Cependant, il arrive parfois que les parties du code dont vous dépendez ne soient pas encore écrites ou disponibles. Dans ces cas-là, les mocks peuvent être d’une grande aide.
Organisation des tests unitaires avec Mockito
Principes de Base
Lorsque vous organisez vos tests, il est crucial de partir des classes les plus indépendantes et de monter vers les classes dépendantes. Cela signifie que vous devez tester d’abord les classes qui ne dépendent que de peu ou pas d’autres classes. Ensuite, vous pouvez tester les classes qui dépendent des premières.
Cette figure présente l’organisation naturelle des tests :
Exemple : Si vous avez une classe Dé qui est indépendante et ne dépend que de la fonction aléatoire, vous devez tester cette classe avant de tester une classe Gobelet qui utilise plusieurs dés.
Classes responsables pour tests unitaires efficaces
- Classes Responsables :Ce sont des classes qui ont une responsabilité définie et ne dépendent pas d’autres composants pour fonctionner. Par exemple, la classe Dé est responsable du lancer d’un dé et ne dépend que d’une fonction aléatoire.
- Classes Indépendantes :Ce sont des classes qui n’ont pas d’impact sur d’autres classes lorsque leur code est modifié. La classe Gobelet peut être modifiée pour ajouter de nouvelles fonctionnalités sans affecter la classe Dé si les deux sont correctement séparées.
Cette figure présente une approche de l’organisation naturelle des tests, illustrant deux types de classes : Classes Responsables et Classes Indépendantes .
En suivant cette approche, vous pouvez structurer vos tests de manière à tester d’abord les classes responsables, puis les classes dépendantes.
Mock objects : clé des tests logiciels
Introduction aux Mock Objects
Les mock objects sont des objets factices qui simulent le comportement d’objets réels. Ils sont particulièrement utiles lorsque vous devez tester une unité de code qui dépend d’autres composants dont vous n’avez pas encore l’implémentation.
Exemple d’utilisation : Vous avez une interface Position avec une méthode getLongitude(). Si la classe qui implémente cette interface n’est pas encore disponible, vous pouvez créer un mock de Position pour tester le code qui utilise cette interface.
Dépendances et Configuration
Pour utiliser Mockito dans un projet Android Studio, vous devez ajouter les dépendances nécessaires à votre fichier build.gradle. Voici comment ajouter Mockito à votre projet :
Ajouter les Dépendances :
Dans le fichier build.gradle de votre module de test, ajoutez les lignes suivantes :
Ce code Gradle configure les dépendances pour les tests unitaires dans un projet Java. Il inclut Mockito pour simuler des objets et tester les interactions entre classes, ainsi que JUnit pour écrire et exécuter les tests. Ces bibliothèques sont utilisées uniquement pour les tests et n’affectent pas le code de production.
dependencies{
testImplementation 'org.mockito:mockito-core:4.8.0' testImplementation 'org.mockito:mockito-inline:4.8.0' testImplementation 'junit:junit:4.13.2'}
Dans le fichier build.gradle , nous obtenons ce résultat, comme présenté dans la figure suivante.
Configurer Mockito :
Vous devrez peut-être configurer votre projet pour utiliser Mockito correctement, en particulier en ce qui concerne les versions de JDK et les dépendances.
Exemples de tests unitaires sous Mockito
Prenons un exemple pratique pour illustrer l’utilisation de Mockito. Supposons que vous avez une interface Position avec une méthode getLongitude(). Vous pouvez tester cette interface en créant un mock et en définissant son comportement attendu.
Voici comment écrire un test unitaire en utilisant Mockito :
Création de l’Interface Position :
Passons maintenant à l’interface Position, qui définit un contrat pour obtenir la longitude, offrant ainsi une abstraction essentielle pour les différentes implémentations de la position géographique.
Ce code définit une interface appelée Position en Kotlin, qui contient une seule méthode, getLongitude() , retournant un Double . Une interface est une sorte de contrat que les classes doivent suivre lorsqu’elles l’implémentent. Dans ce cas, toute classe qui implémente l’interface Position devra fournir une implémentation de la méthode getLongitude() , qui renverra une valeur représentant la longitude d’une position géographique.
interface Position { fun getLongitude() : Double }
Écriture du Test :
Ce code réalise un test unitaire en utilisant Mockito et JUnit pour vérifier le comportement de la méthode getLongitude() de l’interface Position . D’abord, un mock de l’interface Position est créé, permettant de simuler son comportement sans utiliser une implémentation réelle. Ensuite, le test spécifie que l’appel à getLongitude() doit renvoyer 0.0 . Enfin, la méthode est appelée, et le test vérifie que la valeur retournée est bien 0.0 . Ce test assure que la méthode fonctionne comme prévu, sans dépendre d’une implémentation réelle.
@RunWith(MockitoJUnitRunner::class) class PositionTest {
@Test fun testGetLongitude() {
// Création du mock de Position
val position : Position = mock()
// Définition du comportement attendu
whenever(position.getLongitude())
.thenReturn(0.0)
// Appel de la méthode et vérification du résultat
val result = position.getLongitude() assertEquals(
0.0, result, "La longitude doit être 0.0")
}
}
Pour illustrer les tests unitaires réalisés sur la classe Position, examinons le tableau suivant qui décrit les principales composantes du test.
Éléments du Test | Description |
---|---|
Classe Testée | Position |
Framework Utilisé | Mockito et JUnit |
Annotation | @RunWith(MockitoJUnitRunner::class) |
Méthode de Test | testGetLongitude() |
Objectif | Vérifier que la méthode getLongitude() retourne la valeur attendue de 0.0 |
Mock Créé | Instance de Position simulée à l’aide de Mockito |
Comportement Défini | La méthode getLongitude() retourne 0.0 lorsqu’elle est appelée |
Assertion | Vérification que le résultat est égal à 0.0 |
Dans cet exemple, nous avons créé un mock de Position, défini que la méthode getLongitude() doit retourner 0.0, et vérifié que le résultat correspond à la valeur attendue.
Formez-vous gratuitement avec Alphorm !
Maîtrisez les compétences clés en IT grâce à nos formations gratuites et accélérez votre carrière dès aujourd'hui.
FAQ
Comment organiser les tests logiciels efficacement ?
Qu'est-ce qu'un mock object et pourquoi est-il utile ?
Comment utiliser Mockito dans un projet Android Studio ?
Comment tester une méthode d'une interface sans implémentation ?
Quels sont les avantages de structurer les tests avec des classes responsables et indépendantes ?
Conclusion
En appliquant ces principes de test avec Mockito, vous renforcez la qualité et la fiabilité de vos logiciels. Quels autres outils utilisez-vous pour optimiser vos tests unitaires ?