2016-11-05 35 views
8

我有一个Android库gradle项目。我需要将一些文件复制到资产文件夹以进行robolectric单元测试。如何复制单元测试的调试资产

要做到这一点,我定义副本任务:

task copyDebugAssets(type: Copy) { 
    from "${projectDir}/somewhere" 
    into "${buildDir}/intermediates/bundles/debug/assets" 
} 

但我不能添加此任务,作为一个依赖于processDebugResources任务:

processDebugResources.dependsOn copyDebugAssets 

,因为这个错误的:

Could not get unknown property 'processDebugResources' for object of type com.android.build.gradle.LibraryExtension.

现在我必须在单元测试之前手动执行此任务:

./gradlew clean copyDebugAssets test 

我该如何解决?

回答

3

android插件动态地添加了几个任务。您的.dependsOn行不起作用,因为在gradle尝试处理此行时,processDebugResources任务尚未可用。只要上游任务可用,您应该告诉gradle添加依赖关系:

tasks.whenTaskAdded { task -> 
    if (task.name == 'processDebugResources') { 
    task.dependsOn copyDebugAssets 
    } 
} 
+0

非常感谢,它的作品!你认为,用定制任务复制资产是否正确,或者我应该选择另一种方法? – g4s8

+1

我同意@commonsware,将项目设置更改为指向资产的位置,比复制更好。 – RaGe

3

为什么要复制?其中配置资产应当从拉:

android { 
    // other cool stuff here 

    sourceSets { 
     androidTest { 
      assets.srcDirs = ['../testAssets'] 
     } 
    } 
} 

(与路径替换../testAssets到资产应该来自)

我已经使用这个成功与androidTest的仪器测试。 AFAIK,它应该适用于test或任何其他来源集。

+0

感谢您的回复!我试过你的配置,但它不是成功的。 Robolectric的'AssetManager'尝试从'./build/intermediates/bundles/ /assets'加载资源,但是这个文件夹总是空的。 – g4s8