web-dev-qa-db-fra.com

Mockito + Dexmaker sur Android

J'essaie d'utiliser Mockito dans mon Android projet. J'ai trouvé un très bon tutoriel qui traite de cela: http://www.paulbutcher.com/2012/05/mockito -on-android-pas-par étape /

Fondamentalement, il utilise une nouvelle version de Mockito + Dexmaker et tout fonctionne comme prévu.
Cependant, quand j'essaie de se moquer de Android objet spécifique I.E:

Context context = mock(Context.class);

Je reçois cette exception:

Java.lang.IllegalArgumentException: 
    dexcache == null (and no default could be found; 
    consider setting the 'dexmaker.dexcache' system property)
at com.google.dexmaker.DexMaker.generateAndLoad(DexMaker.Java:359)
at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.Java:252)
at com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.Java:54)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.Java:26)

Toute idée de comment résoudre ce problème?

37
stevo.mit

Du commentaire de @ Rjath de la réponse de @ Mrchaz, cela fonctionne mieux pour moi:

System.setProperty(
    "dexmaker.dexcache",
    getInstrumentation().getTargetContext().getCacheDir().getPath());

Je l'ai mis dans ma méthode setUp().

33
Adil Hussain

J'ai réussi à trouver une solution qui semble travailler pour moi. Pour le manifeste, j'ai ajouté lecture et écrire un stockage externe. Au test, j'ai ajouté System.setProperty("dexmaker.dexcache", "/sdcard"); au test. À l'image de l'émulateur, j'ai ajouté une carte SD.

Je crois que cela fonctionne car par défaut Mockito tente d'utiliser le répertoire du cache d'applications, mais je n'ai jamais exécuté une activité, donc je soupçonne que le répertoire n'est jamais créé par le système d'exploitation.

10
MrChaz

Donc, le problème est avec Dexmaker ne pouvant pas trouver le chemin de cache sur Android> = 4.3 comme d'autres personnes mentionnées et comme décrit dans cette question de dexmaker .

Je suis allé avec la mise en œuvre de la solution de contournement dans un coureur de test instrumenté personnalisé au lieu de tous les tests (ou de leur superclasse) setUp(), car il se sent un peu moins hacky (il est vraiment en un seul endroit - et n'est pas hérité chaque sous-classe) et plus flexible. Par souci de documentation, ce sont les modifications nécessaires pour le faire:

public class CustomInstrumentationTestRunner extends InstrumentationTestRunner {

    @Override public void onCreate (final Bundle arguments) {
        super.onCreate(arguments);

        // temporary workaround for an incompatibility in current dexmaker (1.1) implementation and Android >= 4.3
        // cf. https://code.google.com/p/dexmaker/issues/detail?id=2 for details
        System.setProperty("dexmaker.dexcache", getTargetContext().getCacheDir().toString());
    }
}

Et configurer votre projet (ou votre projet de test) pour utiliser cette classe en tant que test de test instrumenté dans son AndroidManifest.xml Lorsque vous construisez avec la fourmi:

<instrumentation
    Android:name="my.package.CustomInstrumentationTestRunner"
    Android:targetPackage="my.target.package" />

ou son build.gradle Lorsque vous construisez avec la grade:

Android {
    defaultConfig {
        // ...
        testInstrumentationRunner 'my.package.CustomInstrumentationTestRunner'
    }
    // ...
}

Si vous avez d'autres entrées instrumentation, vous pouvez basculer entre eux sur la ligne de commande ou sélectionnez une dans votre IDE Configuration exécutée.

8
desseim

J'ai eu ce problème pour un Android Bibliothèque mais pas pour le projet d'application! Définition de la propriété système "dexmaker.dexcache" comme mentionné ci-dessus a fonctionné autour de la question. Je suis en cours d'exécution Android 4.3 DISPOSITIF NEXUS 4, bâtiment avec 19.0.3 outils, API cible 19, Mes dépendances:

androidTestCompile "org.mockito:mockito-core:1.9.5"
androidTestCompile "com.google.dexmaker:dexmaker:1.0"
androidTestCompile "com.google.dexmaker:dexmaker-mockito:1.0"
3
Markw

On dirait que le Dexmaker Le projet est passé de code Google à GitHub .

Dans le référentiel central Maven Il existe des versions 1.1 et 1.2 publiées en mars 2014 et décembre 2014.

J'ai vérifié que ce problème "dexcache == null" existe toujours via la version 1.2 - mais uniquement sur certains appareils. Par exemple, une galaxie S5 avec Android 5.0 a le problème et une galaxie S4 avec Android 4.4.2 ne le fait pas.

J'ai cloné le référentiel GitHub ( Dernière validation du 12 mars 2015 - CA74669 ) et couru localement, et le problème a été corrigé (il y a aussi des engagements dans l'histoire qui remonte à cela). Donc, une fois une version 1.3, j'espère que ce problème est parti pour bon!

Quelqu'un d'autre veut courir une copie locale de 1.3-Snapshot, voici comment je l'ai fait (sur un Mac, mais d'autres plates-formes doivent fonctionner aussi, vous aurez besoin MVN, adb , et dx On [~ # ~] chemin [~ # ~ # ~]):

  1. git clonehttps://github.com/cittercisme/dexmaker.git
  2. cd dexmaker
  3. mvn install -Dmaven.test.skip=true
  4. cp -R ~/.m2/repository/com/google/dexmaker $Android_HOME/extras/Android/m2repository/com/google
  5. Puis changez la version dans app/build.gradle: androidTestCompile 'com.google.dexmaker:dexmaker:1.3-SNAPSHOT'
    • Ou pom.xml Si vous utilisez Maven pour construire ou écraser votre libs/dexmaker.jar avec ~/.m2/repository/com/google/dexmaker/dexmaker/1.3-SNAPSHOT/dexmaker-1.3-SNAPSHOT.jar Si vous utilisez Eclipse/ant

En outre, FYI, le Rapport d'origine d'origine pour le même numéro sur le code de Google.

3
Stan Kurdziel

Vous pouvez ajouter le noyau Mockito comme une dépendance à la place. Ensuite, cette erreur ne se produira pas et vous n'aurez pas besoin d'une solution de contournement.

dependencies {
   ... 
   testCompile 'org.mockito:mockito-core:1.10.19'
}
2
lucasdeassis

J'ai observé cette question lorsque les manipulations ont fait des manipulations avec des ressources et des dossiers à l'intérieur du dossier test. En réalité, recommencez-vous Android Studio a aidé. Simple, mais travaillé.

0
Array