34 votes

Bibliothèque / framework moqueur qui fonctionne le mieux dans Android?

Je développe une application Android à l'aide de bibliothèques tierces (Twitter4j). Je veux pouvoir me moquer de ces objets (également des objets que j'ai créés) dans JUnit et lors de tests fonctionnels.

Avez-vous de bonnes expériences en utilisant des bibliothèques moqueuses et vous pouvez les recommander?

37voto

Matthias Points 17181

(Mise à jour: Mockito a ajouté le soutien Android à partir de la version 1.9.5 et EasyMock a ajouté le soutien Android à partir de la version 3.2 en tenant compte de ces bits de générer du code à l'exécution et à les rendre enfichables, par exemple en utilisant dexmaker au lieu de cglib.)

Sauf pour android-maquette mentionné par DixonD (ce qui est un assez jeune, non prouvée de la bibliothèque), il n'existe actuellement aucune solution. Vous pouvez oublier tout de suite tout ce CGLib (Mockito, plaine EasyMock), depuis CGLib s'appuie sur l'octet de génération de code et ne fonctionne pas sur Dalvik (il s'appuie également sur les Java Beans paquet, qui ne fait pas partie d'Android).

Pour ce que ça vaut, vous pouvez l'utiliser très peu de se moquer de classes à venir avec Android (comme MockContext), mais ils n'ont pas de vérifier le comportement, ils sont juste des talons. Leur comportement par défaut est de jeter une erreur d'exécution dans chaque méthode, de sorte que vous avez à la sous-classe et remplacer les méthodes que vous voulez pour se moquer.

Cependant, vous pouvez toujours utiliser les moqueries des bibliothèques non-instrumentation des essais, c'est à dire dans votre unité standard de tests exécutés sur la JVM. Vous pouvez utiliser PowerMock de se moquer cadre des méthodes, il a un support pour se moquant de méthodes statiques et les constructeurs, faire de la dérision aussi puissant que par exemple en Ruby (juste de plus en plus pénible à utiliser).

Nous utilisons JUnit 4 + PowerMock + Mockito et se moquer des catégories comme Contexte et TextUtils dans une classe de base dont nous héritons tous les normale de test JUnit. Pour l'instrumentation de tests, nous avons créer des simulacres de classes et de décider à l'aide d'une usine de mise en œuvre (fictif ou non) pour instancier au moment de l'exécution.

7voto

Paul Butcher Points 5349

J'ai récemment publié Borachio, un natif de la Scala se moquant de cadre qui fonctionne sur Android.

Parce que Borachio est écrit en Scala, vous aurez besoin d'écrire vos tests en Scala. Mais il peut être utilisé pour tester le code écrit en Java.

Il y a une description de l'utilisation de Borachio sur Android et sur mon blog:

http://www.paulbutcher.com/2011/03/mock-objects-on-android-with-borachio-part-1/ http://www.paulbutcher.com/2011/03/mock-objects-on-android-with-borachio-part-2/ http://www.paulbutcher.com/2011/03/mock-objects-on-android-with-borachio-part-3/

Mise à JOUR:

Borachio est maintenant ScalaMock.

3voto

John Lehmann Points 1659

Robolectric utilise une approche différente. Au lieu de courir sur la DVM, il "defangs" le SDK Android de sorte que vous pouvez exécuter Android tests directement sur la JVM avec le JUnit4 cadre. Tests, apparemment, de construire et de courir beaucoup plus vite, et nécessitent moins de moqueries.

[Une approche commune] est d'utiliser des cadres fictifs tels que Mockito ou Android Maquette pour se moquer de l'Android SDK. Bien que ce soit un approche valable, nous avons constaté que, sans Robolectric, le niveau de se moquant de test d'une application Android rapidement les rendements les tests qui sont essentiellement les inverser les implémentations de code de l'application.

Robolectric permet un test de style qui est plus proche de boîte noire, rendre les tests plus efficaces pour la refactorisation et permettant les tests pour se concentrer sur le comportement de l'application au lieu de la la mise en œuvre de Android. Vous pouvez toujours utiliser un moqueur cadre de avec Robolectric si vous le souhaitez.

Voici comment il fonctionne:

[Il intercepte] le chargement de la Android classes et de réécriture, le corps des méthodes. Robolectric re-définit Android méthodes afin de renvoyer la valeur null (ou 0, false, etc.), ou si Robolectric va de l'avant les appels de méthode à l'ombre Android les objets donnant le SDK Android comportement.

Une comparaison de Mockito.

1voto

DixonD Points 2637

Android Mock est écrit sur EasyMock 2.4, le fameux framework Mock pour Java.

1voto

rony l Points 1774

mise à jour: il semble easymock 3.2 ajout d'une option pour une connexion et des solutions de rechange pour cglib.

Je suis à l'aide d'easymock 2.5.2 (remarque: ne pas utiliser 3.X). il fonctionne, mais seulement de se moquer des interfaces.

Ainsi, si votre bibliothèque expose des interfaces ou si vous êtes prêt à envelopper nos dépendances avec les interfaces vous pouvez utiliser easymock.

Plus tard, easymock versions telles que easymock 3.x ne fonctionnent pas parce qu'ils utilisent le android incompatible cglib pour la manipulation de bytecode pour les deux classes et les interfaces tout en 2.x l'utilise uniquement pour se moquant de classes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X