2014-01-13 137 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_。 –