【问题标题】:Robolectric 3 : Load test specific resourceRobolectric 3:负载测试特定资源
【发布时间】:2015-06-22 13:30:27
【问题描述】:

我正在使用 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 文件。

知道如何做这些事情吗?

谢谢

【问题讨论】:

    标签: android unit-testing robolectric


    【解决方案1】:

    您可能希望将它放在 src/test/resources/ 中,而不是将 json 放在 src/test/res/raw 中

    然后您可以通过 getResource 使用它(使用最新的构建插件和最新的 AS)

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

    【讨论】:

    • 我发现我需要使用资源/文件夹而不是 res/(或 assets/)我调整了我的测试以从类加载器加载文件,而不是使用 android 原始加载。跨度>
    【解决方案2】:

    这是一个已知问题,在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
      }
    }
    

    【讨论】:

      【解决方案3】:

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

      类似这样的:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 2019-04-24
        • 2015-09-04
        • 1970-01-01
        相关资源
        最近更新 更多