2014-01-13 65 views
3

想要在Gradle-Android項目中能夠依賴AAR進行單元測試。我不想在我的項目中手動包含外部庫源代碼或二進制文件(出於多種原因)。依賴於'aar'的Gradle Android單元測試

我們所用的build.gradle依賴於遠程AAR文件是這樣的:

compile 'com.facebook:facebook-android-sdk:3.6.0:@aar'

但是用在這裏描述的gradle這個測試方法時:https://stackoverflow.com/a/16952507/821636(由於Jake Wharton's plugin,是還沒有應用) ,試圖包括AAR因爲這樣該方法的依賴:

testLocalCompile 'com.facebook:facebook-android-sdk:3.6.0:@aar

似乎並沒有真正包括在CLA的AAR用於測試的sspath(使用./gradlew check運行),因爲我在aar中獲得了NoClassDefFoundError。注意:如果以這種方式包含jar依賴項,它們就可以工作。

因爲它不是默認的依賴類型(jar),所以需要添加aar擴展的任務,因此必須考慮這個問題localTest

下面是任務從複製的拷貝這樣,請回答上面提到的:

task localTest(type: Test, dependsOn: assembleDebug) { 
    testClassesDir = sourceSets.testLocal.output.classesDir 
    workingDir = "${rootProject.projectDir}/app/src/main" 

    android.sourceSets.main.java.srcDirs.each { dir -> 
     def buildDir = dir.getAbsolutePath().split('/') 

     buildDir = (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/') 
     sourceSets.testLocal.compileClasspath += files(buildDir) 
     sourceSets.testLocal.runtimeClasspath += files(buildDir) 
    } 

    classpath = sourceSets.testLocal.runtimeClasspath 
} 

回答

3

我遇到了這個問題,並找到了解決方案 - 包括從分解束(.aar)的classes.jar建立文件夾。我不認爲這將有助於在.aar依賴關係中查找資源。

testLocalCompile fileTree(dir: "$project.buildDir/exploded-bundles", include: "**/classes.jar") 

編輯:由於Android的搖籃構建工具0.9.0的依賴已更改爲:

androidTestCompile fileTree(dir: "$project.buildDir/exploded-aar", include: "**/classes.jar") 

由於Android的搖籃插件0.12.2

testLocalCompile fileTree(dir: "$project.buildDir/intermediates/exploded-aar/", include:"**/classes.jar") 
+0

是的,假設我可以手動提取lib幷包含這種方式,但是我做了通過構建文件的依賴管理應該照顧的事情。很高興知道有一種方法可以在需要的時候對其進行破解(但是之後的資源......)看起來像android-gradle-aar生態系統還沒有。 –

+0

我使用這一行,本質上,也引用這個類似的問題我的:http://stackoverflow.com/a/24954215/821636'unitTestCompile fileTree(dir:「$ project.buildDir/intermediates/exploded-aar /」 ,包括:「**/classes.jar」) '自Android Gradle插件0.12.2開始。將此標記爲已被接受,因爲它已演變成迄今爲止效果最好的答案。 –

+0

任何運氣修改此方法與味道?當我添加味道時,testLocal無法找到我的類的_any_。 –