我一直关注this tutorial设置Robolectric以测试我的Android Gradle项目。
我一直在犯这个错误:
android.content.res.Resources$NotFoundException: no such label com.mypackage.dev:string/app_name
通过从教程中下载示例项目,我已经确定问题是我的productFlavors
(dev,staging,production)。向工作示例项目添加flavor会导致同样的问题。您可以看到我build.gradle in this answer的大纲。
我已经看到了各种答案(例如here),这表明我需要为每种口味指定sourceSets
。我已经尝试了很多组合,但不能完全正确。有人可以帮忙吗?
令我困惑的另一件事是我见过的所有Robolectric样本似乎都在为“instrumentTest”指定sourceSets和依赖项,即使Robolectric测试总是只在“test”文件夹中。在我的情况下,我已经在instrumentTest文件夹中进行了Robotium测试,我不明白为什么我需要为Robotium代码添加Robolectric依赖项。
答案 0 :(得分: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);
}
我希望这会有所帮助。
答案 1 :(得分:0)
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。
答案 2 :(得分: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".../>
)