Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在Robolectric 3.0的TestRunner中定义TargetSDK_Android_Unit Testing_Android Studio_Robolectric - Fatal编程技术网

Android 如何在Robolectric 3.0的TestRunner中定义TargetSDK

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

当使用Robolectric 2.4时,我们可以定义testRunner以获得AndroidManifest,并将GetTargetSDK版本定义为以下代码

@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。