使用Gradle和Robolectric时出现资源未找到异常(Resources$NotFoundException)

15

我一直在按照这篇教程设置Robolectric来测试我的Android Gradle项目。

但我一直遇到这个错误:

android.content.res.Resources$NotFoundException: no such label com.mypackage.dev:string/app_name
通过从教程中下载示例项目,我确定问题出在我的productFlavors(dev、staging、production)上。将flavor添加到可工作的示例项目会导致相同的问题。您可以在此答案中查看我的build.gradle的大纲。 我看到了各种答案(例如这里),建议我需要为每个flavor指定。我尝试了很多组合,但仍然不能完全正确地理解它。有人能帮忙吗?
让我感到困惑的另一件事是,我见过的所有Robolectric示例似乎都指定了"instrumentTest"的sourceSets和dependencies,即使Robolectric测试始终只在"test"文件夹中。在我的情况下,我已经在instrumentTest文件夹中拥有Robotium测试,并且我不明白为什么我需要为Robotium代码添加Robolectric依赖项。
3个回答

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版本中修复了这个问题。因此,只需使用带有@Config注释中定义的常量参数的最新版本的Robolectric即可。

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

@RunWith(RobolectricTestRunner.class)

另外,还有一个重要的事项——为了正确使用Robolectric,您在gradle.build中的applicationId应该等于AndroidManifest中的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".../>
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接