Android Robolectric 3.0-使用applicationIdSuffix时未解析资源
我已经成功地使用此代码在Robolectric 2.4的应用程序及其单元测试中加载资源:Android Robolectric 3.0-使用applicationIdSuffix时未解析资源,android,unit-testing,robolectric,Android,Unit Testing,Robolectric,我已经成功地使用此代码在Robolectric 2.4的应用程序及其单元测试中加载资源: getContext().getResources().getIdentifier(resName, "string", getContext().getPackageName()); 其中,上下文将是应用程序中的MyApplication和机器人测试中的TestMyApplication 在Robolectric 3.0中,当将applicationIdSuffix添加到构建文件时,调用将返回0 这是一
getContext().getResources().getIdentifier(resName, "string", getContext().getPackageName());
其中,上下文将是应用程序中的MyApplication和机器人测试中的TestMyApplication
在Robolectric 3.0中,当将applicationIdSuffix添加到构建文件时,调用将返回0
这是一个已知的问题吗?这是在com.android.tools.build:gradle:1.2.0-beta1和org.roblectric:roblectric:3.0-rc2上
更新作为解决方法,我创建了另一个构建风格
jenkins
,在那里我删除了后缀编辑。不幸的是,如果您想测试特定/定制的味道,这不是合适的解决方案。对于Robolectric 3.0,您可能应该使用RobolectricGradleTestRunner
而不是基本的RobolectricTestRunner
。此测试运行程序允许您使用常量类指定特定于生成变量的所有详细信息。对于您的特定情况,它还允许指定适当的应用程序ID。这将帮助您解决您在测试中遇到的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 = "";
}
}
@RunWith(RobolectricGradleTestRunner.class)
@配置(emulasesdk=Build.VERSION_CODES.KITKAT,
常量=SomeTestClass.BuildConfig.class)
公共类SomeTestClass{
@试验
public void someTest()引发异常{
String s=RuntimeEnvironment.application.getResources().getString(R.String.app_name);
assert(s).equals(“某些调试名称”);//使用applicationIdSuffix生成的BuildConfig将使用带有后缀的包名,这在Robolectric 3.0下不起作用
我的解决方案是创建RobolectricGradeleteStrunner的子类并“重写”getPackageName()函数(不能直接重写它,它是私有静态的),以返回没有后缀的硬编码包名。实际上现在有一个简单的修复方法,只需添加@Config即可(constants=BuildConfig.class,packageName=com.your.package)
请参见感谢您提供的详细答案。不幸的是,这导致了java.lang.UnsupportedOperationException:Robolectric不支持API级别1。在org.roblectric.internal.SdkConfig.(SdkConfig.java:28)
运行测试时。在测试套件@config(仿真SDK=Build.VERSION\u CODES.KITKAT)之前添加配置块
或任何您试图模仿的Android版本。谢谢,我可能应该有RTFM:)现在测试运行了,但基本问题仍然存在。RobolectricGradleTestRunner不推荐使用。这是我的问题,我需要能够测试多个构建变体。请注意,您可以在测试类路径中的roblectric.properties文件中设置全局属性。例如,对于src/test中的测试,我创建了src/test/resources/robolectric.properties文件具有以下值。如果您还使用@Config注释,我相信这会完全覆盖相关测试的全局属性文件;它不会将局部值分层到全局值之上。-示例robolectric.properties(每行一个):sdk=21
packageName=com.your.package.name
constants=com.your.package.name.BuildConfig
错误:android.content.res.Resources$NotFoundException:String resource ID#0x7f0b0020I认为通过@Config注释或全局roblectric.properties文件设置packageName更简单、更干净。请参阅Philipp E.的回答,以及我对属性文件的评论。