2014-03-13 64 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