【问题标题】:How to copy debug assets for unit tests如何复制调试资产以进行单元测试
【发布时间】:2016-11-05 10:14:46
【问题描述】:

我有一个 android 库 gradle 项目。我需要将一些文件复制到 assets 文件夹以进行 robolectric 单元测试。

为此,我定义了一个复制任务:

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

但我无法将此任务添加为 processDebugResources 任务的依赖项:

processDebugResources.dependsOn copyDebugAssets

因为这个错误:

无法为 com.android.build.gradle.LibraryExtension 类型的对象获取未知属性“processDebugResources”。

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

./gradlew clean copyDebugAssets test

我该如何解决?

【问题讨论】:

    标签: android unit-testing gradle android-gradle-plugin android-library


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢,它有效!您认为,使用自定义任务复制资产是否正确,或者我应该选择另一种方法?
    • 我同意@commonsware,将您的项目设置更改为指向您的资产所在的位置,比复制更好。
    【解决方案2】:

    为什么要复制?配置应从何处提取资产:

    android {
        // other cool stuff here
    
        sourceSets {
            androidTest {
                assets.srcDirs = ['../testAssets']
            }
        }
    }
    

    (将../testAssets 替换为资产应来自的路径)

    我已经成功地将它与androidTest 一起用于仪器测试。 AFAIK,它应该适用于 test 或任何其他源集。

    【讨论】:

    • 感谢您的回复!我试过你的配置,但没有成功。 Robolectric 的AssetManager 尝试从./build/intermediates/bundles/<debug|release>/assets 加载资源,但是这个文件夹总是空的。
    猜你喜欢
    • 2012-11-03
    • 2012-01-08
    • 1970-01-01
    • 2016-10-10
    • 2018-04-26
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多