我试图运行一个单元测试,模拟一个子类,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)
...
Run Code Online (Sandbox Code Playgroud)
我的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'
}
Run Code Online (Sandbox Code Playgroud)
在我重新安装Android Studio并更新到builtToolsVersion '25 .0.1'之前,这确实有效.
我正在寻找一种方法来获得我的测试运行器中的Android依赖项.
tyn*_*ynn 22
有时,Android Studio无法将Android类正确加载到类路径中进行测试.在我们的例子中,它通常是android.os.Parcelable.但CI总是很好.
因此,运行./gradlew test应始终在这种情况下工作,并运气好修复Android Studio的依赖项.
Adi*_*ain 14
(这个让我感到困惑和激怒了一段时间,我很高兴我终于到底了!)
首先要注意的是在项目中运行以下命令后...
gradle clean build
Run Code Online (Sandbox Code Playgroud)
...您应该build/generated/mockable-android-XX.jar在工作区中看到一个文件.此文件由mockableAndroidJarGradle任务生成,该任务作为testGradle任务的一部分运行,该任务作为buildGradle任务的一部分运行.
当您的工作区中缺少此文件时会出现此问题,但遗憾的是,Gradle估计mockableAndroidJar任务是最新的,因此会跳过执行它.您可以通过运行以下命令来验证这一点...
gradle mockableAndroidJar --info
Run Code Online (Sandbox Code Playgroud)
......你会看到如下消息......
Skipping task ':Android:mockableAndroidJar' as it is up-to-date (took 0.001 secs).
Run Code Online (Sandbox Code Playgroud)
该解决方案是强制运行mockableAndroidJar摇篮任务,你可以通过运行下面的命令做...
gradle mockableAndroidJar --rerun-tasks
Run Code Online (Sandbox Code Playgroud)
...而瞧你现在应该看到的build/generated/mockable-android-XX.jar文件在您的工作空间和高兴次重新出现在Android的单元测试将再次运行.
今天遇到了这个问题之后,我想分享一下我所做的使它再次运行的工作。
在您的build.gradle文件中,添加:
android {
...
testOptions {
unitTests.returnDefaultValues = true
}
}
Run Code Online (Sandbox Code Playgroud)
并再次同步gradle文件。它现在应该可以正常工作,并且应该生成可模拟的android jar文件。如果gradle文件中没有testOptions,只需将其删除并重新同步即可。
希望对您有所帮助。