Comment tester les activités Android – Bethany Drake
Dans les environnements de test, Android n’existe pas. Cela signifie que tester même l’activité la plus simple peut être délicat.
Lorsque j’ai commencé à développer des applications Android, je n’ai écrit aucun test. Bien sûr que non – je ne faisais que déblayer, faisant des choses pour mon propre plaisir. Ensuite, j’ai décidé d’être un professionnel. J’ai commencé petit, avec l’application la plus simple possible et le test le plus simple possible, et j’ai immédiatement été perplexe. Pour toute personne dans le même bateau, cet article est pour vous!
Disons que vous avez une activité avec un bouton. Lorsque vous appuyez sur le bouton, vous souhaitez ouvrir une activité différente.
Votre code source pourrait ressembler à ceci:
Quelque part, dans un fichier de mise en page, vous définissez `onClick` d’un bouton pour `openOtherActivity`. Mais concentrons-nous uniquement sur le code Kotlin. Pas besoin de viser trop haut, non?
Ensuite (ou de préférence au préalable, si vous appliquez le TDD avec diligence), vous essayez d’écrire un test. Pour commencer, vous pourriez même ne pas vérifier qu’il se comporte comme vous l’attendez: le test le plus simple possible est simplement «lorsque vous appelez la fonction, rien n’explose».
Cela pourrait ressembler à ceci:
Cependant, même ce test très simple entraîne une erreur:
`java.lang.RuntimeException: méthode startActivity dans android.app.Activity non mocked.`
En effet, dans les environnements de test, les éléments spécifiques à Android n’existent pas. Il s’agissait d’un choix de conception délibéré par Android, et il a ses avantages et ses inconvénients. Un résultat de cette décision pour les tests unitaires est que nous devons nous moquer des composants spécifiques à Android.
Une bibliothèque moqueuse pour kotlin est Mockk, que j’utiliserai pour cet exemple. Toute autre bibliothèque de simulation similaire devrait faire l’affaire.
Revenons donc à notre test. Nous pouvons nous moquer de la méthode startActivity (et garder tout le reste comme la vraie chose) en utilisant `spyk` de Mockk:
Et maintenant le test passe!
À partir de là, nous pourrions étendre le test pour vérifier de manière plus approfondie le comportement réel de la fonction. Par exemple, qu’il appelle `startActivity` avec le bon type d’intention.
Pour l’exemple suivant, supposons que nous voulons ajouter quelques extras à l’intention avant d’ouvrir l’activité:
Nous essayons d’exécuter un test simple similaire, vérifiant simplement que rien n’explose.
Nous avons utilisé la même astuce moqueuse que la dernière fois, mais nous obtenons maintenant une autre erreur:
`java.lang.RuntimeException: méthode putExtra dans android.content.Intent non mocked.`
Cela ressemble assez à la dernière erreur. Cependant, nous ne pouvons pas le réparer de la même manière.
Nous n’avons pas accès à l’intention, car elle est créée à l’intérieur de l’activité. Cela signifie que se moquer de l’intention est délicat.
Une façon de résoudre ce problème consiste à injecter un objet d’usine, que nous pouvez moquer.
L’objet d’usine a besoin d’une fonction que nous pouvons utiliser pour créer une intention sans appeler directement le constructeur. Cela pourrait ressembler à ceci:
Ensuite, nous devons injecter cette usine dans l’activité afin de pouvoir la remplacer dans le test.
L’injection de dépendances peut être réalisée dans Android en utilisant un framework comme Dague. Mais nous n’en avons pas besoin – une implémentation naïve fonctionne bien pour commencer. Nous pouvons simplement passer la dépendance en tant que paramètre facultatif à l’activité. Ainsi:
Lors de l’exécution, `ExempleActivité` sera créé avec la valeur par défaut, ce qui créera une nouvelle intention réelle. Maintenant, cependant, nous pouvons le remplacer dans notre test pour être un objet factice:
Notez que mettre `relax = true` donne une maquette qui retourne des simulations par défaut pour chaque appel de méthode.
Et le tour est joué! Tests unitaires pour une activité Android, mais avec toutes les choses spécifiques à Android moquées en toute sécurité.
Ressources: