如何在Robolectric 3.0

时间:2015-05-28 04:20:36

标签: android unit-testing android-studio robolectric

使用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类中。

3 个答案:

答案 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。