Home:ALL Converter>Does Robolectric require Java 9?

Does Robolectric require Java 9?

Ask Time:2019-06-30T06:17:12         Author:The_Martian

Json Formatter

All the tests are passing, but I get the below warning. Robolectric is telling me that Java 9 is required. I am using the latest version of Robolectric.

[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

Process finished with exit code 0

This is my Gradle:

    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"
    }

Author:The_Martian,eproduced under the CC 4.0 BY-SA copyright license with a link to the original source and this disclaimer.
Link to original article:https://stackoverflow.com/questions/56821193/does-robolectric-require-java-9
chikwapuro :

on your test class, you need to annotate with @Config with an array of sdk as a parameter.\n@Config(sdk = {Build.VERSION_CODES.O_MR1})\nclass SampleTest {}\n\nfor Kotlin\n@Config(sdk = [Build.VERSION_CODES.O_MR1])\nclass SampleTest {}\n\nYour tests should run.",
2019-07-10T10:40:31
David Miguel :

Robolectric 4.3.1 added support for API 29 but... with the following requirement:\n\nRunning tests on Android API 29 now strictly requires a Java9 runtime or newer\n\nSo if you are targeting API 29 or higher, you have to run your Robolectric using Java9.\n\nUpdate 28/07/21: Using Java 11 in Android Studio\nAndroid Studio Arctic Fox 2020.3.1 (with AGP 7.0) now bundles JDK 11 and configures Gradle to use it by default.\nRef:\n\nJDK 11 required to run AGP 7.0\nUse Java 11 source code in your project\nAndroid Studio Arctic Fox | 2020.3.1 release notes\n\nUpdate 26/08/20: Using Java 9 in Android Studio\nSince Android Studio 3.6.0 you can setup JDK9 in the File/Project Structure dialog without problems.\n\nAlso, Android Studio will also start using JDK 11 in 4.2 (more info).\nOld answer:\nUnfortunately, you cannot configure your Android Studio project to use JDK9 yet (as Android Studio 3.5.3):\n\nBut you can change the target JRE to JDK9 from your test run configuration (Run / Edit Configuration):\n\n\nKeeping Robolectric with Java 8\nIf you don't want to / cannot use Java 9, there are a couple of workarounds to be able to run your tests using Java 8:\nConfigure Robolectric to emulate a lower SDK in the whole project:\n\nCreate a robolectric.properties file under app/src/test/resources.\nIn the file add the following like to emulate Android API28:\n\nrobolectric.properties\nsdk=28\n\nNote: if you have a multi-module project, theoretically you can have a global robolectric.properties in the root directory of your project. But I couldn't make it work... so, unfortunately, I had to duplicate the file for every module, e.g. core/src/test/resources.\nDocs: robolectric.properties file\nConfigure Robolectric to emulate a lower SDK in a specific test:\nIf you don't want to configure the emulated SDK for the whole project, you can configure it for individual tests using the Robolectric @Config annotation:\n@RunWith(AndroidJUnit4::class)\n@Config(sdk = [Build.VERSION_CODES.P])\nclass MyRobolectricTest {...}\n\nDocs: @Config annotation\n\nWhy is Java 9 required by Robolectric to support Android Q?\nRobolectric uses the AOSP build toolchain to build the Android Framework JARS. For Q, the Java toolchain was updated to use java9, and thus produce java9 bytecode (version 53 class files). Attempting to run Robolectric tests on Q on a java8 SDK would then fail with an error like:\njava.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\n\nDx in Android Q was also updated to support version 53 class files. Because Robolectric uses these Framework Jars, there's no way around requiring a Java 9+ JVM. (more info)",
2020-01-08T15:50:11
Wryday :

Annotate your test with \n\n@Config(sdk = Build.VERSION_CODES.O_MR1)\n\n\nor sdk = 27. The annotation can go above the class or the test method that's causing the error.\n\nYou may still get the warning that Java 9 is required, but the test will run against the supported SDK.",
2019-07-03T20:39:49
Eugen Martynov :

You have to run on Java 9 only when you test against Android Q. Check compatibility section on https://github.com/robolectric/robolectric/releases/tag/robolectric-4.3",
2019-06-30T21:27:42
paulfranco :

//For Kotlin\n@Config(sdk = [Build.VERSION_CODES.O_MR1])\n@RunWith(RobolectricTestRunner::class)\nclass MainActivityTest {\n}",
2021-02-03T03:28:17
yy