当我将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时,资源看起来会被完全填充。
答案 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