Android Robolectric是否支持API级别?

Android Robolectric是否支持API级别?,android,robolectric,Android,Robolectric,我有一些测试,我想用Robolectric运行,我使用2.3-SNAPSHOT,因为我的应用程序使用ActionbarCompat,我需要使用2.3-SNAPSHOT版本,因为Robolectric以前找不到AppCompat主题。因此,我在Eclipse中设置了类路径,结果如下: java.lang.UnsupportedOperationException: Robolectric does not support API level 9, sorry! at org.robolectric

我有一些测试,我想用Robolectric运行,我使用2.3-SNAPSHOT,因为我的应用程序使用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)
java.lang.UnsupportedOperationException:Robolectric不支持API级别9,抱歉!
位于org.roblectric.SdkConfig(SdkConfig.java:24)
位于org.roblectric.roblectricttestrunner.pickSdkVersion(roblectricttestrunner.java:288)
位于org.roblectric.roblectrictTestRunner.getEnvironment(roblectrictTestRunner.java:264)
访问org.roblectric.roblectricttestrunner.access$100(roblectricttestrunner.java:57)
位于org.roblectric.roblectrictTestRunner$2.evaluate(roblectrictTestRunner.java:186)
位于org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
位于org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
位于org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
访问org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
位于org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
位于org.roblectric.roblectrictTestRunner$1.evaluate(roblectrictTestRunner.java:172)
位于org.junit.runners.ParentRunner.run(ParentRunner.java:236)
位于org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
位于org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
位于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级别

是否有人能正常工作?

根据,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"));

你确定你已经试过了吗?

更新:注释现在是
@Config(sdk=18)
(或者
@Config(sdk=Build.VERSION\u CODES.JELLY\u BEAN\u 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特定测试意味着什么,但至少其他测试应该有效。

如果像我这样的人仍然访问链接以发现类似错误

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

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

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

因此,我将其模拟为21。

您是否尝试将miniumum sdk更改为8并查看?我也累了18。当我在处理一些与KitKat相关的东西时,我需要使用API级别19。有人知道为什么它不支持API级别19吗?他们已经将文件移到了这里,并添加了对版本4.4_r1和5.0.0_R2的支持。它对我来说是有效的,现在在API 18上并不重要。谢谢谢谢有没有一种方法可以在全球范围内进行设置?我不想在每次测试时设置(希望稍后取消设置)。根据我放在那里的链接,一个
org.roblectric.Config.properties
文件应该为您的整个项目执行此操作。有没有办法在测试级别而不是类级别执行此操作?我在一个类中的行为会根据API级别进行更改,并希望对其进行测试。
@Config(emulateSdk=18)
将不再工作。它需要是
@Config(sdk=Build.VERSION\u CODES.JELLY\u BEAN\u MR2)
,等等!请问你是怎么发现这个的?我在任何地方都找不到它。我在从3.0-rc2升级到3.0的过程中遇到了其他类似的问题,我确信这些问题必须在某处记录下来。。。!甚至我都在磕头。这里有一个快速的维基参考,可能对你有用:-)