Robolectric 3:负载测试特定资源

Robolectric 3 : Load test specific resource

我正在使用 Robolectric 3,我正在尝试加载我的 test/res/ 文件夹中的一些资源。

这是我的文件层次结构:

project/
|-src/
|--main/
|---AndroidManifest.xml
|---res/
|----raw/
|-----prod.json
|--test/
|---java/
|----com.app/
|-----CustomTestRunner.java
|-----Mytest.java
|---res/
|----raw/
|-----test.json

我想在 MyTest.java 中做类似

的事情
RuntimeEnvironment.application.getResources().openRawResource(R.raw.test);

但我不想覆盖我所有的 "standard" res/ 文件夹,因为我还需要 prod.json 我的测试中的文件。

知道如何做这些事情吗?

谢谢

在 gradle 中,您可以添加标准分辨率来定义测试分辨率。

像这样:

android{

sourceSets {

    test {
        res.srcDirs = ['src/test/res', 'src/main/res']

        }
    }
}

这是一个已知问题并在 https://code.google.com/p/android/issues/detail?id=136013

进行了跟踪

一些报告称,gradle android 插件版本 1.3 已修复此问题,但 android studio 未修复。计划对 Android Studio 1.3 进行修复,但有人发布了一个解决方法,该方法适用于版本 1.2

中的两种工具

这里的代码稍微修改了一下,因为我找不到用过的StringUtils class:

gradle.projectsEvaluated {
  def variants = android.applicationVariants.collect()

  tasks.withType(Test) { task ->
    try {
        variants.each { variant ->
            def buildTypeName = variant.buildType.name.capitalize()

            def productFlavorNames = variant.productFlavors.collect { it.name.capitalize() }
            if (productFlavorNames.isEmpty()) {
                productFlavorNames = [""]
            }
            def productFlavorName = productFlavorNames.join('')
            def flavor = uncapitalize(productFlavorName)

            def variationName = "${productFlavorName}${buildTypeName}"

            if (task.name.contains(variationName)) {
                def variationPath = variant.buildType.name;

                if (productFlavorName != null && !productFlavorName.isEmpty()) {
                    variationPath = uncapitalize(productFlavorName) + "/" + variationPath
                }

                def copyTestResourcesTask = project.tasks.create("copyTest${variationName}Resources", Copy)
                copyTestResourcesTask.from("${projectDir}/src/test/resources")
                copyTestResourcesTask.into("${buildDir}/intermediates/classes/test/${variationPath}")

                // Makes the test task depend on the copy test resource variation task
                task.dependsOn(copyTestResourcesTask)

                variants.remove(variant)

                throw new Exception("Break") // Breaking the loop
            }
        }
    } catch (Exception e) {} // Just drop the exception
  }
}

与其将 json 放入 src/test/res/raw,不如将其放入 src/test/resources/

然后您可以通过 getResource

使用它(使用最新的构建插件和最新的 AS)

请注意旧版本中存在错误 - 您需要使用 Canary 频道的 AS:https://code.google.com/p/android/issues/detail?id=136013