Robolectric是否支持API级别?


71

我有一些要与Robolectric一起运行的测试,我使用2.3-SNAPSHOT,因为我的APP使用的是ActionbarCompat,而我需要使用2.3-SNAPSHOT版本,因为Robolectric以前找不到AppCompat主题。因此,我在Eclipse中设置了类路径,最终得到了以下结果:

java.lang.UnsupportedOperationException: Robolectric does not support API level 9, sorry!
at org.robolectric.SdkConfig.<init>(SdkConfig.java:24)
at org.robolectric.RobolectricTestRunner.pickSdkVersion(RobolectricTestRunner.java:288)
at org.robolectric.RobolectricTestRunner.getEnvironment(RobolectricTestRunner.java:264)
at org.robolectric.RobolectricTestRunner.access$100(RobolectricTestRunner.java:57)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:186)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:172)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

我的测试项目清单如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.vendor.test" 
      android:versionCode="1"
      android:versionName="1.0">
      <application>
           <uses-library android:name="android.test.runner" />
      </application>
      <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19" />
      <instrumentation android:name="android.test.InstrumentationTestRunner"
       android:targetPackage="com.vendor" />
</manifest>

无论我使用什么,我总是抱怨API级别。

任何人都可以工作吗?


您是否尝试过将最小sdk更改为8并看到?
user2511882 2013年

Answers:


87

更新:注释现在是@Config(sdk = 18)(或@Config(sdk = Build.VERSION_CODES.JELLY_BEAN_MR2)),链接中提到的属性文件现在是robolectric.properties

原始答案: 您可以使用@Config注释让Robolectric模拟一个SDK版本。你可以这样:

import org.robolectric.annotation.Config;

@Config(emulateSdk = 18) // now @Config(sdk = 18) as of Robolectric 3.0
@RunWith(RobolectricTestRunner.class)
public class SomeTest ...

也可以使用此处提到的文件来实现

不确定对KitKat特定测试意味着什么,但至少其他测试应该可以工作。


1
它对我有用,现在对使用API​​ 18并不重要。谢谢!
Kitesurfer 2014年

谢谢!有没有办法在全球范围内进行设置?我不想在每次测试时都设置(以后希望取消设置)
ligi 2014年

是的 根据我在其中放置的链接,org.robolectric.Config.properties文件应该对整个项目都适用。
2014年

有什么方法可以在测试级别而不是课程级别上执行此操作?我在基于API级别更改的类中有行为,并希望对其进行测试。
karl 2014年

3
@Config(emulateSdk = 18)将不再起作用。它必须是@Config(sdk = Build.VERSION_CODES.JELLY_BEAN_MR2),等等
Tash Pemhiwa '16

28

如果像我这样的人仍在访问该链接以获取类似错误,

@Config(emulateSdk = )现在不工作。它改为sdk
@Config(constants = BuildConfig.class, sdk=21)

对我来说,目标版本22出现错误,

java.lang.UnsupportedOperationException: Robolectric does not support API level 22

所以我将其模拟为21。


1
谢谢!你是怎么发现这个的?我无法在任何地方找到它的文档。从3.0-rc2升级到3.0时,我还有其他类似的问题,而且我相信他们必须在某个地方进行记录……!
马克·史密斯

这是一个快速的Wiki参考资料,可能对您有用:-) github.com/robolectric/robolectric/wiki/…–
Nicks

10

根据SdkConfig.java,Roboelectric仅支持以下版本/ API级别:

SUPPORTED_APIS.put(Build.VERSION_CODES.JELLY_BEAN, new SdkVersion("4.1.2_r1", "0"));
SUPPORTED_APIS.put(Build.VERSION_CODES.JELLY_BEAN_MR1, new SdkVersion("4.2.2_r1.2", "0"));
SUPPORTED_APIS.put(Build.VERSION_CODES.JELLY_BEAN_MR2, new SdkVersion("4.3_r2", "0"));
SUPPORTED_APIS.put(Build.VERSION_CODES.KITKAT, new SdkVersion("4.4_r1", "0"));
SUPPORTED_APIS.put(Build.VERSION_CODES.LOLLIPOP, new SdkVersion("5.0.0_r2", "0"));

您确定您尝试过这些吗?


3
我也很累18。当我处理一些与KitKat相关的东西时,我需要使用API
Level19。– Kitesurfer

2
有人知道为什么它不支持API Level 19吗?
sirFunkenstine

他们将文件移至github.com/robolectric/robolectric/blob/master/robolectric/src/…并添加了对版本4.4_r1和5.0.0_r2的支持
Alexander Prokofyev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.