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

时间:2017-03-16 20:55:27

标签: android junit

我正在尝试运行一个模拟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依赖项。

6 个答案:

答案 0 :(得分:19)

有时,Android Studio无法将Android类正确加载到类路径中进行测试。在我们的例子中,它通常是android.os.Parcelable。但CI总能正常运作。

因此,运行./gradlew test应始终适用于此类场合,并且运气好的方法可以修复Android Studio的依赖项。

答案 1 :(得分:13)

(这个让我感到困惑和激怒了一段时间,我很高兴我终于明白了!)

首先要注意的是,在项目中运行以下命令后......

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设备测试将再次运行。

答案 2 :(得分:5)

今天面对这个问题之后,我想分享我的所作所为,让它再次发挥作用。

在build.gradle文件中,添加:

android {
...

testOptions {
        unitTests.returnDefaultValues = true
    }
}

再次同步gradle文件。它现在应该工作,应该生成可模拟的android jar文件。 如果你的gradle文件中没有testOptions,只需删除它并重新同步。

我希望它有所帮助。

答案 3 :(得分:3)

您还可以在文件菜单

下的工作室中尝试无效缓存和重启选项

答案 4 :(得分:2)

在我的情况下,通过清除app/build目录解决了问题。我不知道,但由于某种原因gradle clean命令,没有这样做,我必须手动完成

答案 5 :(得分:0)

对于我来说,我只是运行Gradle任务中的“测试”任务,它将所有内容还原。

enter image description here