Android 如何在Robolectric 3.0的TestRunner中定义TargetSDK
当使用Robolectric 2.4时,我们可以定义testRunner以获得AndroidManifest,并将GetTargetSDK版本定义为以下代码Android 如何在Robolectric 3.0的TestRunner中定义TargetSDK,android,unit-testing,android-studio,robolectric,Android,Unit Testing,Android Studio,Robolectric,当使用Robolectric 2.4时,我们可以定义testRunner以获得AndroidManifest,并将GetTargetSDK版本定义为以下代码 @Override protected AndroidManifest getAppManifest(Config config) { return new AndroidManifest(Fs.fileFromPath(MANIFEST_PROPERTY), Fs .fileFromPath(RES_PRO
@Override
protected AndroidManifest getAppManifest(Config config) {
return new AndroidManifest(Fs.fileFromPath(MANIFEST_PROPERTY), Fs
.fileFromPath(RES_PROPERTY)) {
@Override
public int getTargetSdkVersion() {
return TARGET_SDK_VERSION;
}
};
}
在Robolectric 3.0中,我们对获取AndroidManifest的定义作了如下更改
@Override
protected AndroidManifest getAppManifest(Config config) {
return createAppManifest(Fs.fileFromPath(MANIFEST_PROPERTY), Fs.fileFromPath(RES_PROPERTY), Fs.fileFromPath(ASSET_PROPERTY));
}
这很好。但是现在,我如何在Robolectric 3.0中设置GetTargetSDK版本呢?请注意,在Android Studio中,我们没有在AndroidManifest中定义TargetSdkVersion。我目前使用@Config来解决这个问题,但希望将所有内容都放在TestRunner类中。试试这个
@RunWith(RobolectricGradleTestRunner.class)
@Config(sdk=18)//在这里您可以更改sdk版本
公共类MyClassTest。。。{
@试验
公共空间{
// ...
}
}
从这里开始
更新
所以我检查了你最后的评论,我想到了这个,我不认为这是一个最终的答案,但我希望至少它能给你一个提示
我所做的,在阅读了机器人的密码后,我发现了这个
@覆盖
受保护的AndroidManifest getAppManifest(配置){
//Logger.error(“SDK版本”+config.SDK());
Properties props=新属性();
道具设置属性(“sdk”、“5”);
Config c=Config.Implementation.fromProperties(props);
//Logger.error(“来自属性的SDK”+c.SDK());
//Logger.error(“来自属性的SDK”+props.getProperty(“SDK”);
返回super.getAppManifest(config);
}
所有的伐木工人都在工作,并展示我所指定的内容,但这就是我被卡住的地方。所以我尝试重写createAppManifest
,看看上面的更改是否影响了它,但我不知道如何运行这个方法
@覆盖
受保护的AndroidManifest createAppManifest(FsFile manifestFile、FsFile resDir、FsFile assetDir){
AndroidManifest an=createAppManifest(manifestFile、resDir、assetDir);
//Logger.error(“目标SDK版本”+an.getTargetSDK版本());
返回一个;
}
这是相当丑陋和骇客,必须有一个更好的解决办法。如果你在robolectric的邮件列表中提问,你可能会得到更好的答案
抱歉:/我做了一些研究,并通过重写getConfigProperties()方法解决了这个问题。试试这个:
public class CustomTestRunner extends RobolectricTestRunner {
private static final String MANIFEST = "src/main/AndroidManifest.xml";
private static final String SDK = "18";
public CustomTestRunner(Class<?> testClass) throws InitializationError {
super(testClass);
}
@Override
protected Properties getConfigProperties() {
Properties properties = new Properties();
properties.setProperty("manifest", MANIFEST);
properties.setProperty("sdk", SDK);
return properties;
}
}
公共类CustomTestRunner扩展了RobolectrictTestRunner{
私有静态最终字符串MANIFEST=“src/main/AndroidManifest.xml”;
私有静态最终字符串SDK=“18”;
公共CustomTestRunner(类testClass)引发初始化错误{
超级(测试类);
}
@凌驾
受保护的属性getConfigProperties(){
属性=新属性();
setProperty(“清单”,清单);
setProperty(“sdk”,sdk);
归还财产;
}
}
您可以在自定义RobolectrictTestRunner中重写方法pickSdkVersion。谢谢Eric。正如我在上面的输入中所提到的,这就是我已经在做的事情。i、 e.“我目前使用@Config来解决这个问题,但我想把所有东西都放在TestRunner类中。”我真的很抱歉,我完全错过了这一部分。我更新了我的答案。我尝试了一些方法,但我不知道如何测试它是否有效(它没有失败,但我不知道如何测试它:P)无论如何,如果你找到了答案,请分享。我还没有找到答案。复制这一点的简单方法是,如果您有Robolectic 2.4测试,只需升级gradle以下载最新版本。i、 e.测试编译“org.roblectric:shadows-support-v4:3.0-rc2”。但是请注意,由于有很多更改,新版本可能与现有测试不兼容。顺便说一句,我仍然对你的答案投1票,因为其他完全迷路的用户仍然会将你的答案称为变通方法。这仍然是一个可行的解决方案,只是对于每个测试,我们都需要对其进行注释。谢谢Eric。我只是好奇,是什么阻止了你在3.0中像在2.4中那样返回清单文件?在这两种情况下,getAppManifest
都返回一个AndroidManifest
对象。它是如何失败的?我实际上使用的是org.roblectric:roblectric:3.0-rc3
,所以升级它不会有问题:P。