2016-11-05 34 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