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