首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Robolectric需要Java 9吗?

Robolectric需要Java 9吗?
EN

Stack Overflow用户
提问于 2019-06-29 22:17:12
回答 6查看 36.1K关注 0票数 84

所有的测试都通过了,但我得到了以下警告。Robolectric告诉我,Java 9是必需的。我正在使用最新版本的Robolectric。

代码语言:javascript
复制
[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

这是我的秤:

代码语言:javascript
复制
    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"
    }
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2019-07-10 10:40:31

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

代码语言:javascript
复制
@Config(sdk = {Build.VERSION_CODES.O_MR1})
class SampleTest {}

为科特林

代码语言:javascript
复制
@Config(sdk = [Build.VERSION_CODES.O_MR1])
class SampleTest {}

你的测试应该运行。

票数 101
EN

Stack Overflow用户

发布于 2020-01-08 15:50:11

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

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

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

更新28/07/21:在Android中使用Java 11

AndroidStudio北极圈福克斯2020.3.1 (带有AGP 7.0)现在捆绑JDK 11,并默认配置Gradle来使用它。

参考:

更新26/08/20:在Android中使用Java 9

由于AndroidStudio3.6.0,您可以在“文件/项目结构”对话框中设置JDK9,而不会出现问题。

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

旧答案:

不幸的是,您还不能将Android项目配置为使用JDK9 (如Android 3.5.3那样):

但是,可以将目标JRE从测试运行配置(Run / Edit Configuration)更改为Run / Edit Configuration

使用Java 8保持Robolectric

如果您不想/不能使用Java 9,有几个解决办法可以使用Java 8运行您的测试:

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

  1. robolectric.properties下创建一个app/src/test/resources文件。
  2. 在文件中添加以下类似于模仿Android API28的内容:

robolectric.properties

代码语言:javascript
复制
sdk=28

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

博士:robolectric.properties文件

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

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

代码语言:javascript
复制
@RunWith(AndroidJUnit4::class)
@Config(sdk = [Build.VERSION_CODES.P])
class MyRobolectricTest {...}

博士:@Config注释

为什么Robolectric需要Java 9来支持Android?

Robolectric使用AOSP构建工具链来构建。对于Q,被更新为使用java9,从而生成java9字节码(版本53类文件)。在java8 SDK上尝试在Q上运行Robolectric测试将失败,错误如下:

代码语言:javascript
复制
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中的Dx也被更新,以支持53版本的类文件。因为Robolectric使用这些Framework,所以没有办法要求Java。(更多信息)

票数 87
EN

Stack Overflow用户

发布于 2019-07-03 20:39:49

注释您的测试

代码语言:javascript
复制
@Config(sdk = Build.VERSION_CODES.O_MR1)

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

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

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56821193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档