2017-03-16 6 views
9

SQLiteOpenHelperの子クラスを模擬する単体テストを実行しようとしていますが、次のエラーが発生しています。Android jUnitテストjava.lang.NoClassDefFoundError:android/database/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) 
    ... 

マイ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' に更新します。

私はテストランナーで自分のアンドロイドの依存関係を取得する方法を探しています。

+5

'./gradlew test'で動作しますか? – tynn

+1

@tynnはい、うまくいくようですが、それはたくさんの依存関係をダウンロードしました。またAndroid Studioでも動作します。私はアンドロイドスタジオのサイドバー "Gradle> [MyProjectsName]> Verfication> test"のクリックはCLIと同じだと思っていましたが、いくつかの違いがあると思います。これを回答として掲示すれば、私は+1して正しいことを確認します。 – Victory

+1

ありがとう@tynn、私のために働いた。 AS –

答えて

19

AndroidスタジオでAndroidクラスがテスト用のクラスパスに正しく読み込まれないことがあります。私たちの場合、通常はandroid.os.Parcelableです。しかし、CIは常に正常に動作します。

だから、./gradlew testを実行すると、そのような機会に、いつでもAndroid Studioの依存関係を修正することができます。

+0

ヒントありがとう、これはAndroid Studioのバグのようです。 – Victory

+1

確認できませんでした。 CIは助けました。 – tynn

+0

私の一日が節約されました.1時間後にオンラインでヘルプを探して検索しました。 – Ewoks

1

あなたはまた、キャッシュを無効にしようとすると、ファイルメニューの下のスタジオでオプションを再起動することができ

+0

私にとってはうまくいかなかった。 –

6

(この1つは混乱して、今しばらくの間、私を腹立たしいと私はようやくの底に持っている超うれしいましたそれ!注意す)

最初の事はあなたのプロジェクトで次のコマンドを実行した後...

gradle clean build 

...あなたワークスペースにbuild/generated/mockable-android-XX.jarファイルを参照する必要があることです。このファイルは、グラードタスクの一部として実行されるtestグラードタスクの一部として実行されるmockableAndroidJarグラードタスクによって生成されます。

問題は、このファイルがワークスペースに存在しないが、残念ながらmockableAndroidJarタスクが最新のものであると推定し、実行をスキップすると発生します。

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

ソリューションが実行を強制することです...あなたは...次のコマンドを実行して

gradle mockableAndroidJar --info 

をこれを確認することができます...と次のようにメッセージの何かが表示されますあなたは、次のコマンドを実行して行うことができますmockableAndroidJar Gradleのタスク...

gradle mockableAndroidJar --rerun-tasks 

...そして出来上がりあなたのワークスペースにbuild/generated/mockable-android-XX.jarファイルが再び表示され、Androidユニットテストがもう一度実行されることをうれしく思います。

1

私の場合は、app/buildディレクトリをクリアすることで解決しました。私は何らかの理由でgradle cleanコマンドを実行していませんでしたが、手動で行う必要がありました。

2

今日この問題に直面した後、私は再び動作させるために何をしたのか分かりたいと思います。

ビルド中。グラデルファイルを追加してください:

android { 
... 

testOptions { 
     unitTests.returnDefaultValues = true 
    } 
} 

と再度同期のgradleファイル。それは今すぐ動作しなければならないと嘲笑いアンドロイドのjarファイルが生成される必要があります。 あなたのgradleファイルにtestOptionsがない場合は、それを削除して再同期してください。

私はそれが役に立ちそうです。