Robolectric 3:负载测试特定资源

时间:2015-06-22 13:30:28

标签: android unit-testing robolectric

我正在使用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);

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

知道如何做这些事情吗?

谢谢

3 个答案:

答案 0 :(得分:2)

而不是将json放在src / test / res / raw中,你可能想把它放在src / test / resources /

然后你可以通过getResource

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

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

答案 1 :(得分:1)

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

进行了跟踪

有人报告说这是用gradle android插件版本1.3修复的,但不适用于android studio。针对Android Studio 1.3进行了修复,但有人发布了一个适用于1.2版本中的两种工具的解决方法

这里的代码有一个小的修改,因为我找不到使用过的StringUtils类:

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
  }
}

答案 2 :(得分:0)

在gradle中,您可以定义添加标准资源的测试资源。

这样的事情:

android{

sourceSets {

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

        }
    }
}