Robolectric 3.0 - 使用 applicationIdSuffix 时资源未解析

Robolectric 3.0 - Resource not resolved when using applicationIdSuffix

我已经成功地使用此代码在应用程序及其单元测试中加载资源 Robolectric 2.4:

getContext().getResources().getIdentifier(resName, "string", getContext().getPackageName());

其中 Context 在应用程序中是 MyApplication,在 Robolectric 测试中是 TestMyApplication。

对于 Robolectric 3.0,当 applicationIdSuffix 添加到构建文件时,这不再有效,调用 returns 0.

这是一个已知问题吗?这是在 com.android.tools.build:gradle:1.2.0-beta1 和 org.robolectric:robolectric:3.0-rc2

更新 https://github.com/robolectric/robolectric/issues/1623

作为解决方法,我创建了另一种构建风格 jenkins,其中删除了后缀编辑。不幸的是,如果您想测试某些东西 specific/customised 的味道,这不是合适的解决方案。

对于 Robolectric 3.0,您应该使用 RobolectricGradleTestRunner 而不是基本的 RobolectricTestRunner。此测试运行器允许您使用常量 class 指定特定于构建变体的所有详细信息。对于您的特定情况,它还允许指定适当的 applicationId。这应该可以帮助您解决使用 applicationIdSuffix 进行测试时遇到的问题。

用法如下:

@RunWith(RobolectricGradleTestRunner.class)
@Config(emulateSdk = Build.VERSION_CODES.KITKAT,
    constants = SomeTestClass.BuildConfig.class)
public class SomeTestClass {
    @Test
    public void someTest() throws Exception {
        String s = RuntimeEnvironment.application.getResources().getString(R.string.app_name);

        assert(s).equals("Some Debug Name"); // <-- defined in src/debug/res/values/strings.xml
    }

    public static class BuildConfig {
        public static final String APPLICATION_ID = "com.some.company.special";
        public static final String BUILD_TYPE = "debug";
        public static final String FLAVOR = "";
    }
}

这里有几点需要注意:

  1. 我们是 运行 Gradle 特定测试运行器 @RunWith(RobolectricGradleTestRunner.class)

  2. 我们正在配置此测试以通过 @Config 块中的 constants 属性 使用特定的应用程序配置。 BuildConfig.FLAVOR 的空字符串用于没有特定简单或复合风味的情况。

  3. BuildConfig class 中指定的 APPLICATION_ID 应与您在 build.gradle 文件中为构建变体指定的 applicationId 匹配。

  4. 我们指望 android-gradle 插件能够正确合并我们针对特定构建变体的所有资源。

使用 applicationIdSuffix 生成的 BuildConfig 将使用带有后缀的包名称,这在 Robolectric 3.0.

下不起作用

我的解决方案是创建 RobolectricGradleTestRunner 的子类和 "override" getPackageName() 函数(不能直接覆盖它,它是私有静态的)到 return 硬编码包名称没有后缀。

现在实际上有一个简单的修复方法,只需添加 @Config(constants = BuildConfig.class, packageName = com.your.package)

https://github.com/robolectric/robolectric-samples/tree/master/android-flavors