Test de code Android avec JUnit et le JDK

J'écris des tests POJO pour mon code Android.

Je veux les exécuter localement avec le JDK (pas avec Dalvik sur l'émulateur) – pour la vitesse, JUnit 4, Mockito, et être capable d'exécuter sans tête sans appareil – donc j'ai un projet "Java" séparé dans Eclipse.

  • Impossible de régler le son de la notification push dans Android
  • Comment créer une barre de progression circulaire (diagramme circulaire) comme indicateur - Android
  • Détection de NFC sur les périphériques Android
  • Android java opencv 2.4 convexhull convexdefect
  • La granularité de la gestion de la mémoire Android - Activité ou processus?
  • Android: Kotlin avec Butterknife
  • Si la méthode que je teste fait référence à n'importe quoi à partir du SDK d'Android, par ex. android.util.Log , le test échoue – cela a du sens car android.jar n'est pas dans le classpath. Pour reproduire, j'ai ce cas de test:

     public class FooTests { @Test public void testFoo() { android.util.Log.d("x", "y"); } } 

    Si j'ajoute android.jar explicitement au classpath du projet de test, j'ai des exceptions comme

     java.lang.RuntimeException: Stub! at android.util.Log.d(Log.java:7) at com.example.FooTests.testFoo(FooTests.java:39) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ... at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

    Existe-t-il un moyen de faire fonctionner le code sans se moquer de tout dernier partage de SDK Android? Peut-être un android.jar existe-t-il déjà?

    EDIT : Pour l'instant, j'ai fini par regrouper des classes comme android.util.Log et les injecter dans les instances, pour les tests classiques basés sur le COC. La suggestion PowerMock de Scott est ma prochaine étape quand j'aurai besoin.

    EDITION ULTÉRIEURE : Robolectric !

  • Modifier la couleur du texte de NumberPicker
  • Comment gérer les erreurs dans AsyncTaskLoader personnalisé?
  • Get Bitmap attaché à ImageView
  • Android MVP - une activité devrait-elle être View or Presenter?
  • Est-il possible d'utiliser les fonctions cryptographiques de la carte SIM?
  • Utiliser jazail pour envoyer de hotmail?
  • 5 Solutions collect form web for “Test de code Android avec JUnit et le JDK”

    Il n'y a pas de moquer android.jar que je connais. J'utilise Powermock pour se moquer de tout. Une chose que vous pouvez faire pour vous aider à se moquer énormément est de rendre vos classes étendues comme les activités, les fragments, les diffuseurs, etc. minces et les faire déléguer aux cours de pojo. Vous pourriez prendre une décision basée sur le risque de ne pas isoler le test unitaire des classes étendues Android, et l'unité d'intégration les teste via le cadre de test Android ou autre chose comme Robotium.

    Pour un véritable test d'unité d'isolement dans Android, pour moi, l'essai d'unité sur java jvm se moquant de toutes les classes collaboratives est le meilleur moyen d'y aller.

    J'ai eu le même problème. Je voulais tester les POJO simples au niveau local.
    Plus précisément, mon code voulait utiliser android.util.Base64.
    Ce que j'ai fini, c'est d'utiliser le SDK pour installer les sources Android 4, et j'ai copié la classe android.util.Base64 dans mon projet.
    Étonnamment, cela a fonctionné.

    J'ai eu le même problème. Je voulais tester la logique métier simple localement. Plus précisément, mon code utilise android.util.SparseArray<E> .

    J'ai essayé 3 approches différentes pour le rendre vérifiable avec junte hors de l'Android.

    • Dans ma logique métier, j'ai créé une interface et l'ai attaché à MySparseArray<E> qui hérite de SparseArray<E> . Dans le test junit, j'ai réintégré l'interface en utilisant HashMap<Integer, E> . Cela fonctionne mais, à long terme, il faut beaucoup de travail pour rendre logique commerciale logique si d'autres appareils android.* sont requis.
    • Comme l'a suggéré @Tal Weiss, j'ai ajouté les sources java Android des classes requises: android.util.SparseArray.java qui utilise com.android.internal.util.ArrayUtils.java . Cela fonctionne aussi, mais je n'aime pas ajouter d'autres sources Android, surtout s'il y a beaucoup plus de dépendances
    • J'ai téléchargé un android.jar binaire gratuit pour un ancien Android 2.2 à partir de http://grepcode.com/snapshot/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1 et l'ai inclus Comme lib dans mon projet junit-java. Ce jar contient uniquement des classes pour les espaces de noms android.* , com.android.* , dalvik.* Et framework.base.* . Cela fonctionne aussi.

    Actuellement, j'ai réussi à éviter d'utiliser les classes android.* Sauf SparseArray<E> dans ma couche métier et n'a aucune dépendance au contexte, à l'activité ou au service. J'aurais pu utiliser HashMap<Integer, E> dans la couche business android au lieu de SparseArray<E> .

    Unmock-plugin pourrait aider https://github.com/bjoernQ/unmock-plugin . Dans mon cas, ça fonctionne avec SparseArray.

    Les tests intégrés Android / Junit ne font-ils pas ce que vous voulez?

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.