Robolectric - 包目标SDK版本=30 > 最大SDK版本=29

45

错误:

java.lang.IllegalArgumentException: 配置失败: 目标SDK版本=30 > 最大SDK版本=29

位于 org.robolectric.RobolectricTestRunner.getChildren(RobolectricTestRunner.java:247) 中 在 org.junit.runners.ParentRunner.getFilteredChildren(ParentRunner.java:534) 获取过滤后的子项 在 org.junit.runners.ParentRunner.getDescription(ParentRunner.java:400) 中获取描述信息 在 androidx.test.ext.junit.runners.AndroidJUnit4.getDescription(AndroidJUnit4.java:149) 中获取描述信息 在 org.junit.runners.model.RunnerBuilder.configureRunner(RunnerBuilder.java:81) 中配置运行器 在 org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:72) 中安全地构建运行器 在 org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:37) 中运行所有默认选项的构建器来生成运行器 在 org.junit.internal.requests.ClassRequest.createRunner(ClassRequest.java:28) 中创建运行器请求 在 org.junit.internal.requests.MemoizingRequest.getRunner(MemoizingRequest.java:19) 中获取运行器 在 com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:50) 中使用参数启动运行器 在 com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) 中使用参数启动运行器 在 com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220) 中准备流并启动运行器 在 com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53) 中启动运行器

由于出现以下错误:java.lang.IllegalArgumentException: 包 目标SDK版本=30 > 最大SDK版本=29

如何解决此问题?
org.robolectric.plugins.DefaultSdkPicker.configuredSdks(DefaultSdkPicker.java: 118) at org.robolectric.plugins.DefaultSdkPicker.selectSdks(DefaultSdkPicker.java: 69) at org.robolectric.RobolectricTestRunner.getChildren(RobolectricTestRunner.java: 213) ... 13 行更多

5个回答

57

发现了这个帖子,与此问题相似,但错误消息不同。
这个答案帮助我解决了这个问题。

app/src/test/resources目录下创建一个robolectric.properties文件,并添加以下内容:

sdk=29  

这将强制Robolectric使用API 29而不是30。

注意:截至2020年9月4日,Robolectric现在支持SDK29。


5
在实施Android 12时,解决“Package targetSdkVersion=31 > maxSdkVersion=30”最新错误的方法与之前相同。Robolectric不支持预发行版的Android S。编译。 https://github.com/robolectric/robolectric/issues/6635 - kuzdu
这个解决方案在2023年仍然适用,只需将sdk更改为31,然后您就可以使用targetSdkVersion 34。 - undefined

33

有两种方法可以实现这个目标:

  1. 创建属性文件(在 Abhimanyu 的回答中提到)

    • app/src/test/resources 中创建 robolectric.properties
    • 在其中添加 sdk=29
  2. 使用 Config 注解限制您的测试目标 SDK。这使您考虑不同的配置用于不同的测试,或避免创建额外的配置文件。

@Config(sdk = [29])
class Test {
 // ...
}

使用配置注释解决了我的问题,而创建属性文件则没有。 - kamdaou

11

以上两个答案都可以正常工作,但是最新版本的Robolectric支持Android SDK 30。

所以只需升级Robolectric依赖项即可解决该问题。

撰写本文时,最新版本为4.5.1。

有关最新版本,请参考官方GitHub网站。


2

只需将您的Robolectric版本更新到4.5或更高版本,他们的仓库已经通知了这个变化:

Robolectric 4.5增加了对Android API 30(R final)的支持,并包含许多错误修复和其他增强功能。

来源:https://github.com/robolectric/robolectric/releases


0
无法配置com.example.android.architecture.blueprints.todoapp.tasks.TasksViewModelTest.addNewTask_setsNewTaskEvent:包targetSdkVersion=31 > maxSdkVersion=30 java.lang.IllegalArgumentException: 无法配置com.example.android.architecture.blueprints.todoapp.tasks.TasksViewModelTest.addNewTask_setsNewTaskEvent:包targetSdkVersion=31 > maxSdkVersion=30
我遇到了几乎相同的错误。当我使用AndroidX Test和Robolectic API执行本地单元测试时,就会生成该错误。我还包含了以下代码,以允许测试API在测试期间使用正确的Android清单文件:
 testOptions.unitTests {
    includeAndroidResources = true
}

我通过将我的编译和目标SDK版本从31降级至30来解决了上述错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接