web-dev-qa-db-fra.com

Test jUnit Android Java.lang.NoClassDefFoundError: Android/base de données/sqlite/SQLiteOpenHelper

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.

11
Victory

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.

19
tynn

(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.

11
Adil Hussain

Vous pouvez également essayer d’invalider l’option de cache et de redémarrer dans Studio sous le menu Fichier.

3
Amit Kaushik

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.

3
Francisco Junior

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.

2
Hossein Shahdoost

Pour mon cas, je viens d'exécuter la tâche "test" à partir de tâches Gradle, sa restauration tout.

 enter image description here

0
Zakir