[英]Gradle Robolectric Resources NotFoundException in Testing
[英]Resources$NotFoundException when using Robolectric with Gradle
我一直在关注这个教程上设置Robolectric来测试我的Android摇篮工程。
我一直在遇到这个错误:
android.content.res.Resources$NotFoundException: no such label com.mypackage.dev:string/app_name
通过从教程中下载示例项目,我已经确定问题是我的productFlavors
(dev,staging,production)。 向工作示例项目添加flavor会导致同样的问题。 你可以在这个答案中看到我的build.gradle的大纲。
我已经看到了各种答案(例如这里 ),这表明我需要为每种风格指定sourceSets
。 我已经尝试了很多组合,但不能完全正确。 有人可以帮忙吗?
令我困惑的另一件事是我见过的所有Robolectric样本似乎都在为“instrumentTest”指定sourceSets和依赖项,即使Robolectric测试总是只在“test”文件夹中。 在我的情况下,我已经在instrumentTest文件夹中进行了Robotium测试,我不明白为什么我需要为Robotium代码添加Robolectric依赖项。
我偶然发现了同样的问题(未找到资源),并在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);
}
我希望这有帮助。
Robolectric在3.0版本中解决了这个问题。 因此,只需在@Config
注释中使用最新版本的Robolectric和已定义的constans参数。
@Config(
sdk = 21,
manifest = "src/main/AndroidManifest.xml",
constants = BuildConfig.class
)
@RunWith(RobolectricTestRunner.class)
此外,一个重要的项目-正确Robolectric工作,你applicationId
在gradle.build
应该等于package
在AndroidManifest
。 applicationIdSuffix
使用不会影响Robolectric。
您可以通过在@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".../>
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.