Все тесты проходят, но я получаю следующее предупреждение. 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"
}
Вы должны работать на Java 9 только при тестировании с Android Q. Проверьте раздел совместимости на https://github.com/robolectric/robolectric/releases/tag/robolectric-4.3.
Я получаю то же предупреждение, даже если я понизился до 27.
Это предупреждение о том, что вам придется использовать Java 9, когда вы будете ориентироваться на Android Q.
Аннотируйте свой тест с помощью
@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, на всякий случай.
Это перестает работать для меня, когда я изменил targetSdkVersion на 29. Почему? Я все еще хочу запустить тест на API 28.
Для меня это изменение было необходимо: @Config(sdk = intArrayOf(Build.VERSION_CODES.O_MR1))
Использовал это для Kotlin и работал, @Config(sdk = [Build.VERSION_CODES.P]) большое спасибо.
Робоэлектрик 4.3.1 добавил поддержку API 29, но... со следующим требованием:
Running tests on Android API 29 now strictly requires a Java9 runtime or newer
Поэтому, если вы ориентируетесь на API 29 или выше, вам нужно запустить Robolectric с использованием Java9.
Android Studio Arctic Fox 2020.3.1 (с AGP 7.0) теперь объединяет JDK 11 и настраивает Gradle на его использование по умолчанию.
Ссылка:
Начиная с Android Studio 3.6.0 вы можете без проблем настроить JDK9 в диалоговом окне «Структура файла/проекта».
Кроме того, Android Studio также начнет использовать JDK 11 в версии 4.2 (больше информации).
Старый ответ:
К сожалению, вы пока не можете настроить проект Android Studio для использования JDK9 (как Android Studio 3.5.3):

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

Если вы не хотите или не можете использовать Java 9, есть несколько обходных путей, позволяющих запускать тесты с использованием Java 8:
Настройте Robolectric для эмуляции более низкого SDK во всем проекте:
robolectric.properties под app/src/test/resources.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 использует цепочку инструментов сборки 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.
Это должен быть выбранный ответ. Это лучший подход, особенно при совместном тестировании модулей и инструментов.
Это самый простой ответ, и он работает. В моем случае мне нужно было просто создать robolectric.properties с sdk=28 внутри пакета app\src\test\resources и вуаля.
//Для Котлина
@Config(sdk = [Build.VERSION_CODES.O_MR1])
@RunWith(RobolectricTestRunner::класс)
класс MainActivityTest { }
В Kotlin для удаления предупреждения добавьте следующую аннотацию.
@Config(manifest = Config.NONE)
@RunWith(RobolectricTestRunner::class)
class UserRepositoryTest {}
Как вы решили этот вопрос?