When will Robolectric be compatible with Android SDK 29? Did I upgraded too early by changing targetSdkVersion
and compileSdkVersion
to 29?
When I run my unit tests I get this huge stacktrace:
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)
properties File. To configure all Robolectric tests within a package or group of packages, create a file named robolectric. properties in the appropriate package. Generally, this file would be placed within the appropriate package directory under src/test/resources in your project tree.
The Android app must have a minimum SDK version 19 or higher.
The Android SDK consists of an emulator, development tools, sample projects with source code, and the required libraries to build Android applications. Let's look at the key components one by one.
Create a robolectric.properties
file inside the app/src/test/resources
directory with the following line:
sdk=28
This will force Robolectric to use API 28 instead of 29.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With