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]()