85 votes

Robolectric nécessite-t-il Java 9 ?

Tous les tests passent, mais je reçois l'avertissement ci-dessous. Robolectric me dit que Java 9 est nécessaire. 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

Le processus s'est terminé avec le code de sortie 0

C'est 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"
    }

0 votes

Comment avez-vous résolu ce problème ?

102voto

chikwapuro Points 46

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

pour Kotlin

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

Vos tests devraient s'exécuter.

0 votes

@Config(sdk = Build.VERSION_CODES.O_MR1) // Pas de freins

3 votes

Si vous voulez exécuter votre test contre toutes les versions du SDK que votre application prend en charge (sauf le SDK 29), l'annotation doit être un peu différente : @Config(maxSdk = Build.VERSION_CODES.P) Build.VERSION_CODES.P est égal à 28, juste au cas où.

1 votes

Cela ne fonctionne plus pour moi lorsque j'ai changé targetSdkVersion en 29. Pourquoi ? Je veux toujours exécuter le test sur l'API 28.

87voto

David Miguel Points 2480

Robolectric 4.3.1 a ajouté le support de l'API 29 mais... avec l'exigence suivante :

L'exécution de tests sur l'API 29 d'Android requiert désormais strictement un runtime Java9 ou plus récent.

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


Utilisation de Java 9 dans Android Studio

Mise à jour du 26/08/20 : Depuis Android Studio 3.6.0, vous pouvez configurer JDK9 dans la boîte de dialogue Structure du fichier/projet sans problème.

JDK 9

En outre, Android Studio commencera également à utiliser le JDK 11 dans la version 4.2 ( plus d'infos ).

Vieille réponse :

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

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


Maintenir le Robolectric avec Java 8

Si vous ne voulez pas / ne pouvez pas utiliser Java 9, il existe quelques solutions de contournement pour pouvoir exécuter vos tests avec 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 l'API28 d'Android :

robolectric.properties

sdk=28

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

Docs : fichier robolectric.properties

Configurer 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 la commande Robolectric @Config annotation :

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

Docs : Annotation @Config


Pourquoi Java 9 est-il requis par Robolectric pour supporter Android Q ?

Robolectric utilise la chaîne d'outils de construction AOSP pour construire les JARS de l'Android Framework. Pour Q, la chaîne d'outils Java a été mise à jour pour utiliser java9, et donc produire du bytecode java9 (fichiers de classe version 53). La tentative d'exécuter des tests Robolectric sur Q avec un SDK java8 échouerait alors avec une erreur du type :

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 dans Android Q a également été mis à jour pour prendre en charge les fichiers de classe de la version 53. Comme Robolectric utilise ces Framework Jars, il n'y a aucun moyen de contourner la nécessité d'une JVM Java 9+. ( plus d'infos )

12voto

Joe Mitchell Points 13

Annotez votre test avec

@Config(sdk = Build.VERSION_CODES.O_MR1)

ou sdk = 27. L'annotation peut être placée au-dessus de la classe ou de la méthode de test qui provoque l'erreur.

Il se peut que vous receviez toujours l'avertissement indiquant que Java 9 est nécessaire, mais le test sera exécuté avec le SDK pris en charge.

6voto

Eugen Martynov Points 5651

Vous devez utiliser Java 9 uniquement lorsque vous effectuez des tests avec Android Q. Consultez la section "Compatibilité" sur le site Web de la Commission européenne. https://github.com/robolectric/robolectric/releases/tag/robolectric-4.3

3 votes

Je reçois le même avertissement même si je rétrograde à 27.

1 votes

Il s'agit d'un avertissement qui indique que vous devrez utiliser Java 9 lorsque vous ciblerez Android Q.

1voto

paulfranco Points 51

//Pour Kotlin

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

@RunWith(RobolectricTestRunner::class)

class MainActivityTest { }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X