使用Robolectric 2.4时,我们可以定义testRunner来获取AndroidManifest,并将getTargetSdkVersion定义为以下代码。
@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中设置getTargetSdkVersion呢?请注意,在Android Studio中,我们不会在AndroidManifest中定义TargetSdkVersion。我目前使用@Config来解决它,但是想将所有内容放在TestRunner类中。
答案 0 :(得分:1)
试试这个
@RunWith(RobolectricGradleTestRunner.class)
@Config(sdk = 18) // Here you can change the SDK version
public class MyClassTest ... {
@Test
public void testSomething() {
// ...
}
}
从这里采取 https://github.com/robolectric/robolectric/issues/1730
<强>更新强>
所以我检查了你的最后一条评论,我想出了这个,我认为这不是最后的答案,但我希望至少它会给你一个提示。
我做了什么,在阅读了Robolectric代码之后我发现了这个
@Override
protected AndroidManifest getAppManifest(Config config) {
// Logger.error("SDK VERSION " + config.sdk());
Properties props = new Properties();
props.setProperty("sdk", "5");
Config c = Config.Implementation.fromProperties(props);
// Logger.error("SDK FROM PROPERTIES " + c.sdk());
// Logger.error("SDK FROM PROPERTIES " + props.getProperty("sdk"));
return super.getAppManifest(config);
}
所有记录器都工作并显示我指定的内容,但这就是我遇到的问题。所以我尝试重写createAppManifest
以查看上面的更改是否影响了它,但我不知道如何运行此方法
@Override
protected AndroidManifest createAppManifest(FsFile manifestFile, FsFile resDir, FsFile assetDir) {
AndroidManifest an = createAppManifest(manifestFile, resDir, assetDir);
// Logger.error("TARGET SDK VERSION" + an.getTargetSdkVersion());
return an;
}
这非常丑陋和hacky,必须有一个更好的解决方案。如果你在robolectric的邮件列表中询问,你可能会得到更好的答案。
抱歉:/
答案 1 :(得分:1)
我做了一些研究,并设法通过重写getConfigProperties()方法来解决这个问题。试试这个:
<script>
console.log(typeof ElementOne); // undefined
var el = new ElementOne(); // fails, obviously
// try on window load
window.onload = function () {
console.log(typeof ElementOne); // undefined
};
</script>
答案 2 :(得分:0)
您可以在自定义RobolectricTestRunner中覆盖方法pickSdkVersion。