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
作为解决方法,我创建了另一种构建风格 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 = "";
}
}
这里有几点需要注意:
我们是 运行 Gradle 特定测试运行器 @RunWith(RobolectricGradleTestRunner.class)
我们正在配置此测试以通过 @Config
块中的 constants
属性 使用特定的应用程序配置。 BuildConfig.FLAVOR
的空字符串用于没有特定简单或复合风味的情况。
BuildConfig
class 中指定的 APPLICATION_ID
应与您在 build.gradle 文件中为构建变体指定的 applicationId 匹配。
我们指望 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
我已经成功地使用此代码在应用程序及其单元测试中加载资源 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
作为解决方法,我创建了另一种构建风格 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 = "";
}
}
这里有几点需要注意:
我们是 运行 Gradle 特定测试运行器
@RunWith(RobolectricGradleTestRunner.class)
我们正在配置此测试以通过
@Config
块中的constants
属性 使用特定的应用程序配置。BuildConfig.FLAVOR
的空字符串用于没有特定简单或复合风味的情况。BuildConfig
class 中指定的APPLICATION_ID
应与您在 build.gradle 文件中为构建变体指定的 applicationId 匹配。我们指望 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