Android jUnit Test java.lang.NoClassDefFoundError: android/database/sqlite/SQLiteOpenHelper

Я пытаюсь запустить модульные тесты, которые издеваются над дочерним классом SQLiteOpenHelper, но я получаю следующую ошибку.

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

Мой файл Gradle выглядит как

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'
}

Это работало до того, как я переустановил Android Studio и обновился до builtToolsVersion '25.0.1 '.

Я ищу способ получить мои зависимости от android в моем тестовом бегуне.

Ответ 1

Иногда Android Studio неправильно загружает классы Android в classpath для тестирования. В нашем случае обычно android.os.Parcelable. Но CI всегда прекрасно работает.

Таким образом, запуск ./gradlew test всегда должен работать в таких случаях и с некоторой удачей исправить зависимости для Android Studio.

Ответ 2

(Этот был запутанным и раздражающим меня какое-то время, и я очень рад, что я, наконец, дошел до конца!)

Первое, что нужно отметить, это то, что после запуска в вашем проекте следующей команды...

gradle clean build

... вы должны увидеть файл build/generated/mockable-android-XX.jar в вашей рабочей области. Этот файл создается с помощью mockableAndroidJar Gradle Задачи, которая запускается как часть задачи test Gradle, которая запускается как часть задачи build Gradle.

Проблема возникает, когда этот файл отсутствует в рабочей области, но Gradle, к сожалению, оценивает задачу mockableAndroidJar для обновления и поэтому пропускает ее выполнение. Вы можете проверить это, выполнив следующую команду...

gradle mockableAndroidJar --info

... и вы увидите сообщение о следующем:

Skipping task ':Android:mockableAndroidJar' as it is up-to-date (took 0.001 secs).

решение - заставить запустить mockableAndroidJar Gradle задачу, которую вы можете выполнить, выполнив следующую команду...

gradle mockableAndroidJar --rerun-tasks

... И Voila теперь должен увидеть файл build/generated/mockable-android-XX.jar снова в вашей рабочей области и рад, когда ваши тесты на Android будут снова запущены.

Ответ 3

Сегодня, столкнувшись с этой проблемой, я хотел бы поделиться тем, что я сделал, чтобы заставить ее работать снова.

В файле build.gradle добавьте:

android {
...

testOptions {
        unitTests.returnDefaultValues = true
    }
}

и синхронизировать файлы gradle. Теперь он должен работать, и должен быть сгенерирован массивный файл андроида. Если у вас не было testOptions в вашем файле gradle, просто удалите его и выполните повторную синхронизацию.

Надеюсь, это поможет.

Ответ 4

В моем случае это было решено путем очистки app/build. Я не знаю, но почему-то команда gradle clean не делала этого, и мне приходилось делать это вручную

Ответ 5

Вы также можете попробовать выполнить недействительный кеш и перезапустить параметр в студии в меню файлов

Ответ 6

В моем случае я просто запускаю тестовое задание из задач Gradle, все восстанавливаем.

enter image description here