Тест jUnit для Android java.lang.NoClassDefFoundError: android/ база данных /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 и обновил до встроенного ToolsVersion '25.0.1'.

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

5 ответов

Решение

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

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

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

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

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

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

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

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

android {
...

testOptions {
        unitTests.returnDefaultValues = true
    }
}

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

Я надеюсь, что это помогает.

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

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

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

Другие вопросы по тегам