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?
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()
.
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.
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.
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"
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 [~ # ~ # ~]):
git clone
https://github.com/cittercisme/dexmaker.gitcd dexmaker
mvn install -Dmaven.test.skip=true
cp -R ~/.m2/repository/com/google/dexmaker $Android_HOME/extras/Android/m2repository/com/google
app/build.gradle
: androidTestCompile 'com.google.dexmaker:dexmaker:1.3-SNAPSHOT'
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/antEn outre, FYI, le Rapport d'origine d'origine pour le même numéro sur le code de Google.
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'
}
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é.