J'essaie d'exécuter des tests unitaires qui se moquent d'une classe enfant de SQLiteOpenHelper
mais je reçois l'erreur suivante.
Java.lang.NoClassDefFoundError: Android/database/sqlite/SQLiteOpenHelper
at Java.lang.ClassLoader.defineClass1(Native Method)
at Java.lang.ClassLoader.defineClass(ClassLoader.Java:763)
at Java.security.SecureClassLoader.defineClass(SecureClassLoader.Java:142)
at Java.net.URLClassLoader.defineClass(URLClassLoader.Java:467)
at Java.net.URLClassLoader.access$100(URLClassLoader.Java:73)
...
at org.dfhu.vpodplayer.util.JsonExporterTest.export(JsonExporterTest.Java:43)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
...
Mon fichier Gradle ressemble à
apply plugin: 'com.Android.application'
Android {
compileSdkVersion 24
buildToolsVersion '25.0.1'
defaultConfig {
applicationId "org.dfhu.vpodplayer"
minSdkVersion 18
targetSdkVersion 24
versionCode 1
versionName "1.2"
testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
targetCompatibility 1.7
sourceCompatibility 1.7
}
}
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:Android-apt:1.8'
}
}
apply plugin: 'com.neenbedankt.Android-apt'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.Android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.Android.support', module: 'support-annotations'
})
compile 'com.Android.support:appcompat-v7:24.2.1'
compile 'com.Android.support:support-v4:24.2.1'
compile 'com.Android.support:recyclerview-v7:24.2.1'
testCompile 'junit:junit:4.12'
testCompile 'org.powermock:powermock-api-mockito:1.6.5'
testCompile 'org.powermock:powermock-module-junit4:1.6.5'
}
Cela fonctionnait avant la réinstallation d'Android Studio et la mise à jour vers builtToolsVersion '25 .0.1 '.
Je cherche un moyen d’obtenir mes dépendances Android dans mon coureur de test.
Parfois, Android Studio ne charge pas correctement les classes Android dans le classpath à des fins de test. Dans notre cas, c'est généralement Android.os.Parcelable
. Mais le CI fonctionne toujours bien.
Donc, exécuter ./gradlew test
devrait toujours fonctionner dans de telles occasions et avec un peu de chance, corrigez les dépendances pour Android Studio.
(Celui-ci m'a confondu et m'a énervé pendant un moment et je suis super content d'avoir enfin compris le fond!)
La première chose à noter est qu'après avoir exécuté la commande suivante dans votre projet ...
gradle clean build
... vous devriez voir un fichier build/generated/mockable-Android-XX.jar
dans votre espace de travail. Ce fichier est généré par la tâche mockableAndroidJar
Gradle qui est exécutée dans le cadre de la tâche test
Gradle exécutée dans le cadre de la tâche build
Gradle.
Le problème se produit lorsque ce fichier est absent de votre espace de travail mais Gradle estime malheureusement que la tâche mockableAndroidJar
est à jour et ne l'exécute donc pas. Vous pouvez le vérifier en exécutant la commande suivante ...
gradle mockableAndroidJar --info
... et vous verrez un message quelque chose comme suit ...
Skipping task ':Android:mockableAndroidJar' as it is up-to-date (took 0.001 secs).
La solution consiste à forcer l'exécution de la tâche mockableAndroidJar
Gradle que vous pouvez effectuer en exécutant la commande suivante ...
gradle mockableAndroidJar --rerun-tasks
... Et Voila vous devriez maintenant voir le fichier build/generated/mockable-Android-XX.jar
réapparaître dans votre espace de travail et vous réjouir que vos tests unitaires Android soient à nouveau exécutés.
Vous pouvez également essayer d’invalider l’option de cache et de redémarrer dans Studio sous le menu Fichier.
Après avoir affronté ce problème aujourd'hui, j'aimerais partager ce que j'ai fait pour que cela fonctionne à nouveau.
Dans votre fichier build.gradle, ajoutez:
Android {
...
testOptions {
unitTests.returnDefaultValues = true
}
}
et synchroniser à nouveau les fichiers de gradation. Cela devrait fonctionner maintenant et le fichier jar Android mockable devrait être généré. Si vous n'avez pas eu testOptions dans votre fichier Gradle, supprimez-le et resynchronisez.
J'espère que ça aide.
Dans mon cas, cela a été résolu en effaçant le répertoire app/build
. Je ne sais pas, mais pour une raison quelconque, la commande gradle clean
ne l'a pas fait et j'ai dû le faire manuellement.