Robolectric - 包 targetSdkVersion=30 > maxSdkVersion=29

Robolectric - Package targetSdkVersion=30 > maxSdkVersion=29

错误:

java.lang.IllegalArgumentException: failed to configure : Package targetSdkVersion=30 > maxSdkVersion=29

at org.robolectric.RobolectricTestRunner.getChildren(RobolectricTestRunner.java:247) at org.junit.runners.ParentRunner.getFilteredChildren(ParentRunner.java:534) at org.junit.runners.ParentRunner.getDescription(ParentRunner.java:400) at androidx.test.ext.junit.runners.AndroidJUnit4.getDescription(AndroidJUnit4.java:149) at org.junit.runners.model.RunnerBuilder.configureRunner(RunnerBuilder.java:81) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:72) at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:37) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70) at org.junit.internal.requests.ClassRequest.createRunner(ClassRequest.java:28) at org.junit.internal.requests.MemoizingRequest.getRunner(MemoizingRequest.java:19) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:50) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53) Caused by: java.lang.IllegalArgumentException: Package targetSdkVersion=30 > maxSdkVersion=29 at 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 more

如何解决这个问题?

发现这个 有同样的问题,但错误消息不同。
帮我解决了问题。

在此处发布相同内容。

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

sdk=29  

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

注意:Robolectric现在最多支持 SDK 29(截至 2020 年 9 月 4 日)。

有两种方法可以实现:

  1. 正在创建道具文件(在 Abhimanyu 的回答中提到)

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

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

以上两个答案都可以,但是robolectric的最新版本支持android sdk 30。

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

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

有关最新版本,请参阅官方 github 网站。

只需将您的 robolectric 版本更新到 4.5 或更高版本,他们的回购通知了此更改:

Robolectric 4.5 adds support for Android API 30 (R final) and contains many bug fixes and other enhancements.

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

failed to configure com.example.android.architecture.blueprints.todoapp.tasks.TasksViewModelTest.addNewTask_setsNewTaskEvent: Package targetSdkVersion=31 > maxSdkVersion=30 java.lang.IllegalArgumentException: failed to configure com.example.android.architecture.blueprints.todoapp.tasks.TasksViewModelTest.addNewTask_setsNewTaskEvent: Package targetSdkVersion=31 > maxSdkVersion=30

出现了与上述几乎相似的错误。该错误是在我使用 AndroidX Test 和 Robolectic APIs 执行本地单元测试时产生的。我还包含了以下代码以允许测试 API 在测试期间使用正确的 Android 清单文件:

 testOptions.unitTests {
    includeAndroidResources = true
}

我通过将编译和目标 sdk 从 31 降级到 30 解决了上述错误