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

时间:2015-04-13 09:22:30

标签: android unit-testing robolectric

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

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

其中Context将是App中的MyApplication和Robolectric测试中的TestMyApplication。

使用Robolectric 3.0,当将applicationIdSuffix添加到构建文件时,这不再有效,调用返回0.

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

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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

作为解决方法,我创建了另一个构建样式jenkins,其中我删除了后缀编辑。不幸的是,如果你想测试一些特定的/定制的味道,那么这不是合适的解决方案。

答案 2 :(得分:0)

对于Robolectric 3.0,您应该使用RobolectricGradleTestRunner而不是基本的RobolectricTestRunner。此测试运行器允许您使用常量类指定特定于构建变体的所有详细信息。对于您的具体情况,它还允许指定正确的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. 我们正在配置此测试,以通过constants块中的@Config属性使用特定的应用程序配置。 BuildConfig.FLAVOR的空字符串适用于没有特定简单或复合味道的情况。

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

  4. 我们依靠android-gradle插件正确合并特定构建版本的所有资源。

答案 3 :(得分:0)

使用applicationIdSuffix生成的BuildConfig将使用带有后缀的包名称,这在Robolectric 3.0下不起作用。

我的解决方案是创建RobolectricGradleTestRunner的子类并“覆盖”getPackageName()函数(不能直接覆盖它,它是私有静态)以返回没有后缀的硬编码包名称。