2017-03-16 44 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,只需將其刪除並重新同步即可。

我希望它有幫助。