Robolectric和Android SDK 29

Robolectric和Android SDK 29,android,robolectric,android-10.0,Android,Robolectric,Android 10.0,Robolectric何时能与Android SDK 29兼容?我是否将targetSdkVersion和compileSdkVersion更改为29而升级得太早了 当我运行单元测试时,我得到一个巨大的堆栈跟踪: java.lang.IllegalArgumentException: API level 29 is not available at org.robolectric.plugins.UnknownSdk.getJarPath(UnknownSdk.java:25)

Robolectric何时能与Android SDK 29兼容?我是否将
targetSdkVersion
compileSdkVersion
更改为29而升级得太早了

当我运行单元测试时,我得到一个巨大的堆栈跟踪:

java.lang.IllegalArgumentException: API level 29 is not available

    at org.robolectric.plugins.UnknownSdk.getJarPath(UnknownSdk.java:25)
    at
org.robolectric.internal.AndroidSandbox$SdkSandboxClassLoader.<init>(AndroidSandbox.java:102)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method)     at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.robolectric.util.inject.Injector.inject(Injector.java:239)   at
org.robolectric.util.inject.Injector.lambda$memoized$1(Injector.java:221)
    at
org.robolectric.util.inject.Injector$MemoizingProvider.get(Injector.java:485)
    at
org.robolectric.util.inject.Injector.getInstanceInternal(Injector.java:213)
    at
org.robolectric.util.inject.Injector.resolveDependencies(Injector.java:283)
    at org.robolectric.util.inject.Injector.inject(Injector.java:237)   at
org.robolectric.util.inject.Injector.lambda$memoized$1(Injector.java:221)
    at
org.robolectric.util.inject.Injector$MemoizingProvider.get(Injector.java:485)
    at
org.robolectric.util.inject.Injector.getInstanceInternal(Injector.java:213)
    at
org.robolectric.util.inject.Injector.getInstance(Injector.java:197)
    at org.robolectric.util.inject.Injector.access$700(Injector.java:85)
    at
org.robolectric.util.inject.Injector$ScopeBuilderProvider.create(Injector.java:551)
    at
org.robolectric.util.inject.Injector$ScopeBuilderProvider.lambda$get$0(Injector.java:534)
    at com.sun.proxy.$Proxy13.build(Unknown Source)     at
org.robolectric.internal.SandboxManager.getAndroidSandbox(SandboxManager.java:57)
    at
org.robolectric.RobolectricTestRunner.getSandbox(RobolectricTestRunner.java:267)
    at
org.robolectric.RobolectricTestRunner.getSandbox(RobolectricTestRunner.java:63)
    at
org.robolectric.internal.SandboxTestRunner$2.evaluate(SandboxTestRunner.java:215)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)    at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)  at
org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)     at
org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)   at
org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)     at
org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)    at
org.robolectric.internal.SandboxTestRunner$1.evaluate(SandboxTestRunner.java:96)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)    at
org.junit.runner.JUnitCore.run(JUnitCore.java:137)  at
org.junit.runner.JUnitCore.run(JUnitCore.java:115)  at
org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:40)
    at
java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
    at
java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.Iterator.forEachRemaining(Iterator.java:116)   at
java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
    at
java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at
java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at
java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
    at
java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
    at
java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at
java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
    at
org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:80)
    at
org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:71)
    at
org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)
    at
org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)
    at
org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)
    at
org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)
    at
org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
    at
com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:74)
    at
com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at
com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at
com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
java.lang.IllegalArgumentException:API级别29不可用
位于org.roblectric.plugins.UnknownSdk.getJarPath(UnknownSdk.java:25)
在
AndroidSandbox$SdkSandboxClassLoader。(AndroidSandbox.java:102)
在sun.reflect.nativeConstructor附件mpl.newInstance0(本机
方法)在
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于org.roblectric.util.inject.Injector.Injector(Injector.java:239)
org.roblectric.util.inject.Injector.lambda$memonized$1(Injector.java:221)
在
org.roblectric.util.inject.Injector$MemoizingProvider.get(Injector.java:485)
在
org.roblectric.util.inject.Injector.getInstanceInternal(Injector.java:213)
在
org.roblectric.util.inject.Injector.resolveDependencies(Injector.java:283)
位于org.roblectric.util.inject.Injector.Injector(Injector.java:237)
org.roblectric.util.inject.Injector.lambda$memonized$1(Injector.java:221)
在
org.roblectric.util.inject.Injector$MemoizingProvider.get(Injector.java:485)
在
org.roblectric.util.inject.Injector.getInstanceInternal(Injector.java:213)
在
org.roblectric.util.inject.Injector.getInstance(Injector.java:197)
访问org.roblectric.util.Injector.Injector.access$700(Injector.java:85)
在
org.roblectric.util.inject.Injector$ScopeBuilderProvider.create(Injector.java:551)
在
org.roblectric.util.inject.Injector$ScopeBuilderProvider.lambda$get$0(Injector.java:534)
位于com.sun.proxy.$Proxy13.build(未知源)
org.roblectric.internal.SandboxManager.getAndroidSandbox(SandboxManager.java:57)
在
org.roblectric.roblectrictTestRunner.getSandbox(roblectrictTestRunner.java:267)
在
org.roblectric.roblectrictTestRunner.getSandbox(roblectrictTestRunner.java:63)
在
org.roblectric.internal.SandboxTestRunner$2.evaluate(SandboxTestRunner.java:215)
位于org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
在
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)位于
org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)位于
org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)位于
org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)位于
org.roblectric.internal.SandboxTestRunner$1.evaluate(SandboxTestRunner.java:96)
位于org.junit.runners.ParentRunner.run(ParentRunner.java:363)
org.junit.runner.JUnitCore.run(JUnitCore.java:137)位于
org.junit.runner.JUnitCore.run(JUnitCore.java:115)位于
org.junit.vintage.engine.execution.runnereExecutor.execute(runnereExecutor.java:40)
在
java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
在
java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
位于java.util.Iterator.ForEachLeving(Iterator.java:116)
Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
在
java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
在
java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
在
java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
在
ForEachOp$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
在
evaluate(AbstractPipeline.java:234)
在
forEach(ReferencePipeline.java:418)
在
org.junit.vintage.engine.VintageTestEngine.executealchildren(VintageTestEngine.java:80)
在
org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:71)
在
org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)
在
org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)
在
org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)
在
org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)
在
org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
在
JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:74)
在
intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
在
com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
在
com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

最新的Robolectric 4.3已经支持Android Q()

如果有人想知道,我的解决方案是用

@Config(sdk = Build.VERSION_CODES.O_MR1)

app/src/test/resources
目录中创建一个
roblectric.properties
文件,并使用以下行:

sdk=28
这将迫使Robolectric使用API 28而不是29。

我们可以使用以下替代方案:

  • 使用Java9或更新版本运行我们的测试。(我们可以在运行测试配置中编辑JRE)
  • 如果我们想使用Java 8运行测试,我们可以:

  • 用注释我们的测试类,以模拟较低的SDK(如@bencri和@julio mendoza所述)
  • 像这样:

    @RunWith(AndroidJUnit4::class)
    @Config(sdk = [Build.VERSION_CODES.P])
    class LoginRobolectricTest {
    //...
    }
    
  • 或者,如@farmerbb所述,使用我们想要运行的SDK将文件添加到
    app/src/test/resources
    文件夹中,例如:
  • sdk=28

    看起来我好像失踪了