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で、builtedToolsVersion '25 .0.1 'にアップデートしました。
テストランナーでAndroid依存関係を取得する方法を探しています。
ときどきAndroid Studioがテスト用にクラスパスにクラスロードに正しくロードしないAndroidクラス。私たちの場合、通常はAndroid.os.Parcelable
。しかし、CIは常に正常に動作します。
実行中./gradlew test
はこのような場合でも常に機能し、運がよければAndroid Studio。
(これはしばらくの間私を混乱させ、苛立たせてきました、そして私は最終的にそれの底に着いたことがとても嬉しいです!)
最初に注意することは、プロジェクトで次のコマンドを実行した後です...
gradle clean build
...あなたshouldワークスペースに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).
solutionはmockableAndroidJar
Gradleタスクを強制的に実行することで、次のコマンドを実行して実行できます...
gradle mockableAndroidJar --rerun-tasks
...そしてVoilaこれでbuild/generated/mockable-Android-XX.jar
ファイルがワークスペースに再表示され、Androidユニットを喜んで倍にできますテストが再度実行されます。
今日この問題に直面した後、私はそれを再び機能させるために私がしたことを共有したいと思います。
Build.gradleファイルに、以下を追加します。
Android {
...
testOptions {
unitTests.returnDefaultValues = true
}
}
そしてgradleファイルを再び同期します。これで動作し、モック可能Android jarファイルが生成されます。gradleファイルにtestOptionsがない場合は、それを削除して再同期してください。
お役に立てば幸いです。
キャッシュを無効にして、ファイルメニューのスタジオでオプションを再起動することもできます
私の場合は、app/build
ディレクトリをクリアすることで解決しました。わかりませんが、何らかの理由でgradle clean
コマンドを実行しなかったため、手動で実行する必要がありました