2014-02-28 39 views
15

我一直在關注如何設置Robolectric來測試我的Android Gradle項目。

我一直在打這個錯誤:

android.content.res.Resources$NotFoundException: no such label com.mypackage.dev:string/app_name 

通過從教程下載示例項目,我已經建立,這個問題是我的productFlavors(開發,分期,生產)。向工作示例項目添加風味會導致相同的問題。你可以看到我的build.gradle in this answer的輪廓。

我見過各種答案(例如here),這表明我需要爲每種口味指定sourceSets。我嘗試了很多組合,但不能完全正確。任何人都可以幫忙嗎?

另一件令我困惑的事情是,我看過的所有Robolectric示例似乎都在指定「instrumentTest」的sourceSets和依賴項,即使Robolectric測試總是隻在「test」文件夾中。在我的情況下,我已經在instrumentTest文件夾中有了Robotium測試,我不明白爲什麼我需要爲Robotium代碼添加Robolectric依賴關係。

回答

1

我偶然發現了同樣的問題(未找到資源),並在robolectric資源上找到了解決方案。 PackageName有一個setter,因此在我的自定義測試運行器中,我在返回清單之前設置了軟件包名稱。喜歡的東西:

@Override protected AndroidManifest getAppManifest(Config config) { 
    String manifestProperty = System.getProperty("android.manifest"); 
    if (config.manifest().equals(Config.DEFAULT) && manifestProperty != null) { 
     String resProperty = System.getProperty("android.resources"); 
     String assetsProperty = System.getProperty("android.assets"); 
     AndroidManifest manifest = new AndroidManifest(Fs.fileFromPath(manifestProperty), Fs.fileFromPath(resProperty), 
       Fs.fileFromPath(assetsProperty)); 
     manifest.setPackageName("com.mypackagename"); 
     return manifest; 
    } 
    return super.getAppManifest(config); 
} 

我希望這有助於。

0

Robolectric在版本3.0中修復了此問題。所以只需使用最新版本的Robolectric和@Config註釋中定義的constan參數。

@Config(
     sdk = 21, 
     manifest = "src/main/AndroidManifest.xml", 
     constants = BuildConfig.class 
) 

@RunWith(RobolectricTestRunner.class) 

此外,還有一個重要的項目 - 正確Robolectric在AndroidManifest工作,你applicationIdgradle.build應該等於package。使用applicationIdSuffix不會影響Robolectric。

0

您可以通過在指定@Config「的packageName」,使之成爲解決這一問題:

@Config(
     sdk = 21, 
     manifest="src/main/AndroidManifest.xml", 
     constants = BuildConfig.class, 
     packageName = "com.mypackage" //this is whatever value is your AndroidManifest.xml at <manifest ... package="com.mypackage".../> 
) 
相關問題