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.
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) :
Mais vous pouvez changer le JRE cible en JDK9 à partir de la configuration de votre exécution de test ( Run / Edit 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 :
- Créer un
robolectric.properties
fichier sous app/src/test/resources
.
- 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 )
0 votes
Comment avez-vous résolu ce problème ?