使用带有Gradle的Robolectric时的资源$ NotFoundException

时间:2014-02-28 17:43:23

标签: android gradle robolectric build.gradle

我一直关注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依赖项。

3 个答案:

答案 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中的AndroidManifestapplicationIdSuffix的使用不会影响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".../>
)