web-dev-qa-db-ja.com

Android jUnit Test Java.lang.NoClassDefFoundError:Android / database / sqlite / SQLiteOpenHelper

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依存関係を取得する方法を探しています。

14
Victory

ときどきAndroid Studioがテスト用にクラスパスにクラスロードに正しくロードしないAndroidクラス。私たちの場合、通常はAndroid.os.Parcelable。しかし、CIは常に正常に動作します。

実行中./gradlew testはこのような場合でも常に機能し、運がよければAndroid Studio。

22
tynn

(これはしばらくの間私を混乱させ、苛立たせてきました、そして私は最終的にそれの底に着いたことがとても嬉しいです!)

最初に注意することは、プロジェクトで次のコマンドを実行した後です...

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).

solutionmockableAndroidJar Gradleタスクを強制的に実行することで、次のコマンドを実行して実行できます...

gradle mockableAndroidJar --rerun-tasks

...そしてVoilaこれでbuild/generated/mockable-Android-XX.jarファイルがワークスペースに再表示され、Androidユニットを喜んで倍にできますテストが再度実行されます。

14
Adil Hussain

今日この問題に直面した後、私はそれを再び機能させるために私がしたことを共有したいと思います。

Build.gradleファイルに、以下を追加します。

Android {
...

testOptions {
        unitTests.returnDefaultValues = true
    }
}

そしてgradleファイルを再び同期します。これで動作し、モック可能Android jarファイルが生成されます。gradleファイルにtestOptionsがない場合は、それを削除して再同期してください。

お役に立てば幸いです。

7

キャッシュを無効にして、ファイルメニューのスタジオでオプションを再起動することもできます

3
Amit Kaushik

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

2

私の場合、Gradleタスクから 'test'タスクを実行するだけで、すべてが復元されます。

enter image description here

1
Zakir