web-dev-qa-db-fra.com

Robolectric nécessite-t-il Java 9?

Tous les tests réussissent, mais je reçois l'avertissement ci-dessous. Robolectric me dit que Java 9 est requis. J'utilise la dernière version de 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

Processus terminé avec le code de sortie 0

Voici mon 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"
    }
27
The_Martian

sur votre classe de test, vous devez annoter avec @Config avec un tableau de sdk comme paramètre.

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

Vos tests devraient s'exécuter.

23
chikwapuro

Robolectric 4.3.1 ajout du support pour API 29 mais ... avec l'exigence suivante:

Exécuter des tests sur Android API 29 nécessite désormais strictement un runtime Java9 ou plus récent

Donc, si vous ciblez l'API 29, vous devez exécuter votre Robolectric en utilisant Java9.


Android Studio

Malheureusement, vous ne pouvez pas encore configurer votre Android projet Studio pour utiliser JDK9 (comme Android Studio 3.5.3): Project structure

Mais vous pouvez changer le JRE cible en JDK9 à partir de votre configuration d'exécution de test (Run / Edit Configuration): Test run configuration


Java 8

Si vous ne souhaitez pas/ne pouvez pas utiliser Java 9, il existe quelques solutions pour pouvoir exécuter vos tests à l'aide de Java 8:

Configurez Robolectric pour émuler un SDK inférieur dans l'ensemble du projet:

  1. Créer un robolectric.properties fichier sous app/src/test/resources.
  2. Dans le fichier, ajoutez ce qui suit pour émuler Android API28:

robolectric.properties

sdk=28

Remarque: si vous avez un projet multi-modules, vous pouvez théoriquement avoir un global robolectric.properties dans le répertoire racine de votre projet. Mais je ne pouvais pas le faire fonctionner ... donc, malheureusement, j'ai dû dupliquer le fichier pour chaque module, par ex. core/src/test/resources.

Documents: fichier robolectric.properties

Configurez Robolectric pour émuler un SDK inférieur dans un test spécifique:

Si vous ne souhaitez pas configurer le SDK émulé pour l'ensemble du projet, vous pouvez le configurer pour des tests individuels à l'aide de Robolectric @Config annotation:

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

Documents: annotation @ config

20
David Miguel

Annotez votre test avec

@Config(sdk = Build.VERSION_CODES.O_MR1)

ou sdk = 27. L'annotation peut aller au-dessus de la classe ou de la méthode de test à l'origine de l'erreur.

Vous pouvez toujours recevoir l'avertissement que Java 9 est requis, mais le test s'exécutera sur le SDK pris en charge.

10
Wryday

Vous devez exécuter sur Java 9 uniquement lorsque vous testez contre Android Q. Vérifiez la section de compatibilité sur https://github.com/robolectric /robolectric/releases/tag/robolectric-4.

5
Eugen Martynov