Требуется ли Robolectric Java 9?

Все тесты проходят, но я получаю следующее предупреждение. Robolectric говорит мне, что требуется Java 9. Я использую последнюю версию 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

Процесс завершен с кодом выхода 0

Это мой 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"
    }

Как вы решили этот вопрос?

Pradeep Sodhi 09.10.2019 13:49
83
1
34 768
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы должны работать на Java 9 только при тестировании с Android Q. Проверьте раздел совместимости на https://github.com/robolectric/robolectric/releases/tag/robolectric-4.3.

Я получаю то же предупреждение, даже если я понизился до 27.

The_Martian 01.07.2019 01:30

Это предупреждение о том, что вам придется использовать Java 9, когда вы будете ориентироваться на Android Q.

Eugen Martynov 02.07.2019 00:11

Аннотируйте свой тест с помощью

@Config(sdk = Build.VERSION_CODES.O_MR1)

или sdk = 27. Аннотация может быть выше класса или метода тестирования, вызвавшего ошибку.

Вы по-прежнему можете получить предупреждение о том, что требуется Java 9, но тест будет выполняться для поддерживаемого SDK.

Ответ принят как подходящий

в вашем тестовом классе вам нужно аннотировать @Config с массивом sdk в качестве параметра.

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

для Котлина

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

Ваши тесты должны работать.

Если вы хотите запустить тест для всех версий SDK, поддерживаемых вашим приложением (кроме SDK 29), аннотация должна выглядеть немного иначе: @Config(maxSdk = Build.VERSION_CODES.P) Build.VERSION_CODES.P равно 28, на всякий случай.

Jenea Vranceanu 27.04.2020 21:50

Это перестает работать для меня, когда я изменил targetSdkVersion на 29. Почему? Я все еще хочу запустить тест на API 28.

ATom 05.05.2020 09:32

Для меня это изменение было необходимо: @Config(sdk = intArrayOf(Build.VERSION_CODES.O_MR1))

Prashant 19.07.2020 18:50

Использовал это для Kotlin и работал, @Config(sdk = [Build.VERSION_CODES.P]) большое спасибо.

Tonnie 21.03.2021 10:40

Робоэлектрик 4.3.1 добавил поддержку API 29, но... со следующим требованием:

Running tests on Android API 29 now strictly requires a Java9 runtime or newer

Поэтому, если вы ориентируетесь на API 29 или выше, вам нужно запустить Robolectric с использованием Java9.


Обновление от 28.07.21: Использование Java 11 в Android Studio

Android Studio Arctic Fox 2020.3.1 (с AGP 7.0) теперь объединяет JDK 11 и настраивает Gradle на его использование по умолчанию.

Ссылка:

Обновление от 26.08.20: Использование Java 9 в Android Studio

Начиная с Android Studio 3.6.0 вы можете без проблем настроить JDK9 в диалоговом окне «Структура файла/проекта».

JDK 9

Кроме того, Android Studio также начнет использовать JDK 11 в версии 4.2 (больше информации).

Старый ответ:

К сожалению, вы пока не можете настроить проект Android Studio для использования JDK9 (как Android Studio 3.5.3): Project structure

Но вы можете изменить целевую JRE на JDK9 из конфигурации тестового запуска (Run / Edit Configuration): Test run configuration


Сохранение Robolectric с Java 8

Если вы не хотите или не можете использовать Java 9, есть несколько обходных путей, позволяющих запускать тесты с использованием Java 8:

Настройте Robolectric для эмуляции более низкого SDK во всем проекте:

  1. Создайте файл robolectric.properties под app/src/test/resources.
  2. В файл добавьте следующее, например, для эмуляции Android API28:

robolectric.properties

sdk=28

Примечание: если у вас многомодульный проект, теоретически вы можете иметь глобальный robolectric.properties в корневом каталоге вашего проекта. Но я не мог заставить это работать... поэтому, к сожалению, мне пришлось дублировать файл для каждого модуля, например. core/src/test/resources.

Документы: файл robolectric.properties

Настройте Robolectric для эмуляции более низкого SDK в конкретном тесте:

Если вы не хотите настраивать эмулируемый SDK для всего проекта, вы можете настроить его для отдельных тестов с помощью аннотации Robolectric @Config:

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

Документы: Аннотация @Config


Почему Robolectric требует Java 9 для поддержки Android Q?

Robolectric использует цепочку инструментов сборки AOSP для сборки Android Framework JARS. Для Q цепочка инструментов Java была обновлена ​​для использования java9 и, таким образом, для создания байт-кода java9 (файлы классов версии 53). Попытка запустить тесты Robolectric на Q в java8 SDK завершится ошибкой, например:

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

Dx в Android Q также был обновлен для поддержки файлов классов версии 53. Поскольку Robolectric использует эти Framework Jars, нет никакой возможности обойтись без Java 9+ JVM. (больше информации)

Версии Java старше 9 также работают. В Linux это может выглядеть так: /lib/jvm/java-11-openjdk-amd64.

Minas Mina 05.04.2020 21:04

Это должен быть выбранный ответ. Это лучший подход, особенно при совместном тестировании модулей и инструментов.

Archie G. Quiñones 11.04.2020 12:14

Это самый простой ответ, и он работает. В моем случае мне нужно было просто создать robolectric.properties с sdk=28 внутри пакета app\src\test\resources и вуаля.

Filipe Bezerra de Sousa 03.02.2021 14:52

//Для Котлина

@Config(sdk = [Build.VERSION_CODES.O_MR1])

@RunWith(RobolectricTestRunner::класс)

класс MainActivityTest { }

В Kotlin для удаления предупреждения добавьте следующую аннотацию.

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

class UserRepositoryTest {}

Другие вопросы по теме