PackageNameSuffix打破了测试 - Robolectric

时间:2014-03-13 17:19:57

标签: android unit-testing robolectric android-gradle

当我将packageNameSuffix添加到我的build.gradle调试版本类型(参见https://plus.google.com/108967384991768947849/posts/XGXH3arvbrK)时,由于以下原因,我的所有Robolectric测试都失败了:

Caused by: android.content.res.Resources$NotFoundException: Unable to find resource ID #0x7f050000
   at org.robolectric.shadows.ShadowResources.getResName(ShadowResources.java:354)
   at org.robolectric.shadows.ShadowResources.openRawResource(ShadowResources.java:387)
   at android.content.res.Resources.openRawResource(Resources.java)
   at com.myapp.utilities.CSVUtility.parseRawResourceCSV(CSVUtility.java:38)

问题似乎是找不到原始文件夹src/main/res/main。此文件夹包含一个在应用程序启动时解析的csv ...这是测试繁荣的地方。

除了架构/数据重组建议(我知道CSV可能不是在应用启动时加载此数据的最佳方式),有谁知道我可以如何解决这个问题?

编辑:我尝试将文件移动到assets文件夹,然后在Context.getString()调用上我的测试失败。添加packageNameSuffixes时,资源看起来会被完全填充。

1 个答案:

答案 0 :(得分:2)

编辑: tmurakami发布在github问题上 - https://github.com/robolectric/robolectric/issues/1001#issuecomment-42740897

我已经复制了完整的回复:


尝试使用此gradle片段。 这在我的环境中工作正常。

def hasLibraryVariants = android.hasProperty('libraryVariants')
def variants = hasLibraryVariants ? android.libraryVariants : android.applicationVariants
tasks.withType(Test).whenTaskAdded {
    it.systemProperty 'android.package', variants.iterator().next().processResources.packageForR
}

原始包名已存储在任何变体的以下字段中:

variantData.variantConfiguration.originalPackageName
processResources.packageForR
generateBuildConfig.buildConfigPackageName

然而,这些只是内部的,所以将来可能无法访问。

如果您不想使用这些字段,请尝试以下代码段:

tasks.withType(Test).whenTaskAdded {
    it.systemProperty 'android.package', android.defaultConfig.packageName
}

要使用此功能,您需要在' android.defaultConfig'中添加主程序包名称。部分。

android {
    defaultConfig {
        packageName 'main.package.name'
    }
}

看起来我需要为包名添加android.package系统属性。在Github上查看此问题对话 - https://github.com/robolectric/robolectric/issues/1001

相关问题