2014-03-13 63 views
2

当我添加一个packageNameSuffix我的build.gradle调试版本类型(见https://plus.google.com/108967384991768947849/posts/XGXH3arvbrK),我所有的Robolectric测试以下失败的原因:PackageNameSuffix打破测试 - 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 ...这是测试进行的地方boom

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

编辑:我试着将文件移动到资产文件夹,然后我的测试失败的Context.getString()调用。在添加packageNameSuffixes时,资源看起来会变得完全混乱。

回答

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