Robolectic 需要 Java9吗?

所有的测试都通过了,但是我得到了下面的警告。Robolectic 告诉我需要 Java9。我用的是最新版的机器电子。

[Robolectric] WARN: Android SDK 10000 requires Java 9 (have Java 8). Tests won't be run on SDK 10000 unless explicitly requested.
[Robolectric] com.example.testcaseWithRobolectric.MainActivityTest.testAllElements: sdk=28; resources=BINARY
Called loadFromPath(/system/framework/framework-res.apk, true); mode=binary sdk=28

工艺完成,退出代码0

这是我的格拉德尔:

    dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation project(path: ':domain_layer')
testImplementation "org.robolectric:robolectric:4.3"
}


defaultConfig {
applicationId "com.example.testcaseWithRobolectric"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
36119 次浏览

只有在对 Android Q 进行测试时,才需要在 Java9上运行,请检查 https://github.com/robolectric/robolectric/releases/tag/robolectric-4.3上的兼容性部分

用。注释您的测试

@Config(sdk = Build.VERSION_CODES.O_MR1)

注释可以位于类或导致错误的测试方法之上。

您可能仍然会收到 Java9是必需的警告,但是测试将针对受支持的 SDK 运行。

在您的测试类中,您需要使用@Config 作为注释,并使用 sdk 数组作为参数。

@Config(sdk = {Build.VERSION_CODES.O_MR1})
class SampleTest {}

为了科特林

@Config(sdk = [Build.VERSION_CODES.O_MR1])
class SampleTest {}

你的测试应该开始了。

Robolectic 4.3.1 增加了对 API 29的支持,但是... ... 有以下要求:

在 Android API 29上运行测试现在严格要求 Java9运行时或更新的运行时

因此,如果您的目标是 API 29或更高版本,那么您必须使用 Java9运行您的 Robolecric。


更新28/07/21: 在 Android Studio 中使用 Java11

AndroidStudio 北极狐2020.3.1(带有 AGP7.0)现在捆绑了 JDK11,并配置 Gradle 默认使用它。

参考:

更新26/08/20: 在 Android Studio 中使用 Java9

从 Android Studio 3.6.0开始,您可以毫无问题地在文件/项目结构对话框中安装 JDK9。

JDK 9

此外,Android Studio 也将在4.2(更多信息)中开始使用 JDK 11。

老答案:

不幸的是,您还不能将 Android Studio 项目配置为使用 JDK9(作为 Android Studio 3.5.3) : Project structure

但是您可以将目标 JRE 从测试运行配置(Run / Edit Configuration)更改为 JDK9: Test run configuration


用 Java8保持 Robolectic

如果您不想/不能使用 Java9,那么有几个变通方法可以使用 Java8运行测试:

在整个项目中配置 Robolectic 以模拟较低的 SDK:

  1. app/src/test/resources下创建一个 robolectric.properties文件。
  2. 在该文件中添加以下内容,比如模仿 Android API28:

robolectric.properties

sdk=28

注意: 如果您有一个多模块的项目,理论上您可以在您的项目的根目录中有一个 全球 robolectric.properties。但是我不能让它工作... 所以,不幸的是,我不得不为每个模块复制文件,例如 core/src/test/resources

医生: Properties 文件

在一个特定的测试中配置 Robolectic 来模拟一个较低的 SDK:

如果您不想为整个项目配置仿真 SDK,您可以使用 Robolectric@Config注释为单个测试配置它:

@RunWith(AndroidJUnit4::class)
@Config(sdk = [Build.VERSION_CODES.P])
class MyRobolectricTest {...}

医生: @ Config 注释


为什么 Robolectic 需要 Java9来支持 Android Q?

Robolectic 使用 AOSP 构建工具链来构建 Android 框架 JARS。对于 Q,Java 工具链被更新为使用 java9,从而生成 java9字节码(版本53类文件)。在 java8 SDK 上尝试在 Q 上运行 Robolecric 测试会失败,并出现以下错误:

java.lang.UnsupportedClassVersionError: org/xmlpull/v1/XmlPullParser has been compiled by a more recent version of the Java Runtime (class file version 53.0), this version of the Java Runtime only recognizes class file versions up to 52.0

Android Q 中的 Dx 也进行了更新,以支持版本53的类文件。因为 Robolectic 使用这些 FrameworkJars,所以没有办法绕过需要 Java9 + JVM 的问题。(更多信息)

//为科特林

@ Config (sdk = [ Build.VERION _ CODES. O _ MR1])

@ RunWith (RobolectricTestRunner: : class)

类 MainActivityTest { }

在 Kotlin,要删除警告,请添加以下注释。

@Config(manifest = Config.NONE)
@RunWith(RobolectricTestRunner::class)


class UserRepositoryTest {}