2017-03-16 43 views
9

我想运行一个单元测试,其中模拟儿童类SQLiteOpenHelper但我得到以下错误。Android的jUnit测试java.lang.NoClassDefFoundError:android /数据库/ sqlite的/ 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) 
    ... 

我的摇篮文件看起来像

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的工作室和更新,以builtToolsVersion '25 .0.1' 。

我正在寻找一种方法在我的测试运行器中获取我的android依赖关系。

+5

它是否适用'./gradlew test'? – tynn

+1

@tynn是的,似乎工作,它下载了一堆的依赖关系,现在它也可以在Android Studio中工作。我认为在Android Studio边栏中单击“Gradle> [MyProjectsName]> Verfication> test”将与CLI相同,但我想有一些区别。如果你发布这个答案,我会+1和检查正确的。 – Victory

+1

谢谢@tynn,为我工作。现在也可以使用AS –

回答

19

偶尔Android Studio不会正确地将Android类加载到类路径中进行测试。在我们的情况下,通常是android.os.Parcelable。但CI始终正常工作。

因此,运行./gradlew test应始终在这种情况下运行,并且有一些运气会修复Android Studio的依赖关系。

+0

感谢您的提示,这对我来说似乎是Android Studio中的一个错误。 – Victory

+1

无法验证它。 CI虽然帮助。 – tynn

+0

救了我一天,经过1小时左右的在线搜索并寻求帮助 – Ewoks

1

您也可以尝试无效缓存文件菜单中的重启工作室选项

+0

它没有为我工作。 –

6

(这一个一直扑朔迷离,现在气死我了一会儿,我超级高兴我终于得到了底部它!)

首先要注意的事情是,在运行您的项目下列命令

gradle clean build 

...你应该看到build/generated/mockable-android-XX.jar文件在您的工作空间后。该文件由mockableAndroidJar Gradle Task生成,该作业是作为build Gradle Task的一部分运行的test Gradle Task的一部分运行。

当您的工作区中缺少该文件时会发生该问题,但Gradle不幸地估计mockableAndroidJar任务是最新的,因此跳过执行它。您可以通过运行以下命令来验证这个...

gradle mockableAndroidJar --info 

...,你会看到一条消息,事情如下...

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

解决方案是强制运行在mockableAndroidJar摇篮任务,你可以通过运行下面的命令做...

gradle mockableAndroidJar --rerun-tasks 

...而现在您应该会看到build/generated/mockable-android-XX.jar文件重新出现在您的工作区中,并且很高兴您的Android单元测试将再次运行。

1

那么在我的情况下,它是通过清除app/build目录解决。我不知道,但由于某种原因gradle clean命令,没有这样做,我不得不这样做,我不得不手动做

2

今天面对这个问题后,我想分享我做了什么使它再次工作。

在你的构建中。gradle文件,请添加:

android { 
... 

testOptions { 
     unitTests.returnDefaultValues = true 
    } 
} 

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

我希望它有帮助。