50 votes

Roboélectrique : Resources$NotFoundException : String resource ID avec Android Gradle Plugin 3

Android Studio 3.0 Beta2
classpath 'com.android.tools.build:gradle:3.0.0-beta3'
testCompile 'org.robolectric:robolectric:3.4.2'

La classe de test que j'utilise ne s'exécute pas :

@Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.LOLLIPOP)
@RunWith(RobolectricTestRunner.class)
public class RecipeAdapterTest {
    private MainActivity activity;

    @Before
    public void setup() {

    activity = Robolectric.setupActivity(MainActivity.class);

    /* Also tried this same Error
     activity = Robolectric.buildActivity(MainActivity)
                .create()
                .resume()
                .get();
    */
    }

    @Test
    public void testActivityShouldNotBeNull() {
        assertThat(activity, is(notNullValue()));
    }
}

Voici la trace de la pile de l'erreur :

android.content.res.Resources$NotFoundException: String resource ID #0x7f0c0020

    at android.content.res.Resources.getText(Resources.java:274)
    at android.content.res.Resources.getString(Resources.java:360)
    at android.content.Context.getString(Context.java:376)
    at org.robolectric.shadows.ShadowActivity.getActivityTitle(ShadowActivity.java:100)
    at org.robolectric.shadows.ShadowActivity.callAttach(ShadowActivity.java:110)
    at org.robolectric.android.controller.ActivityController.attach(ActivityController.java:56)
    at org.robolectric.android.controller.ActivityController.of(ActivityController.java:25)
    at org.robolectric.Robolectric.buildActivity(Robolectric.java:98)
    at org.robolectric.Robolectric.buildActivity(Robolectric.java:94)
    at org.robolectric.Robolectric.setupActivity(Robolectric.java:102)
    at me.androidbox.busbybaking.adapters.RecipeAdapterTest.setup(RecipeAdapterTest.java:63)

Dans le Edit Configurations J'ai réglé le Working Directory a $MODULE_DIR$

Merci beaucoup pour toute suggestion.

0 votes

Vous voyez la même erreur lorsque vous l'exécutez à partir de la ligne de commande et de gradle ?

0 votes

Cela fonctionne si j'ouvre le projet dans Android Studio 2.3.3 et que j'utilise gradle version 2.3.3 et que je définis jackOptions { enabled true } et compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }.

0 votes

jack est déprécarisé. Si vous n'effectuez pas vos modifications dans les build.gradle pouvez-vous l'exécuter avec succès depuis la ligne de commande ?

95voto

andranikAzizbekyan Points 727

Comme indiqué par un ingénieur de l'équipe Google (très probablement Xavier Ducrohet ), Robolectric a des problèmes avec AAPT2 :

Robolectric n'est pas compatible avec aapt2.

Deux options ici.

Première option - suivre Robolectric Directives pour Android Studio 3.0+.

Ajoutez ce qui suit à votre build.gradle :

android {
  testOptions {
    unitTests {
      includeAndroidResources = true
    }
  }
}

Annotez votre test avec le Robolectric test runner :

@RunWith(RobolectricTestRunner.class)
public class SandwichTest {
}

Deuxième option : désactiver AAPT2 en ajoutant la ligne suivante dans gradle.properties fichier :

android.enableAapt2=false

3 votes

Merci, il semble que android.enableAapt2=false fait l'affaire.

1 votes

Cela fonctionne, mais en désactivant cette option : android.enableAapt2=false a provoqué d'autres erreurs. Maintenant, nous devons ajouter un paramètre pour les ressources de type chaîne. Peut-être y a-t-il une meilleure solution ?

0 votes

Android.enableAapt2=false est maintenant déprécié

12voto

sfera Points 91

Le site Documentation robotique indique que la configuration suivante doit être utilisée avec Android Studio 3.x :

android {
  testOptions {
    unitTests.includeAndroidResources true
  }
}

4voto

blipinsk Points 467

(pour tous ceux qui cherchent une solution à un problème similaire)


Veillez à utiliser

RuntimeEnvironment.application

et no :

RuntimeEnvironment.systemContext

lorsque vous essayez de résoudre les ressources "manuellement".

C'est un cas dans lequel Resources$NotFoundException pourrait apparaître avec Robolectric .

2voto

IntelliJ Amiya Points 672

Si votre construction échoue à cause d'un AAPT2 problème de traitement des ressources ou si vous souhaitez utiliser Roboelectric vous pouvez désactiver AAPT2 en fixant android.enableAapt2=false dans votre gradle.properties et redémarrer le démon Gradle en exécutant ./gradlew --stop à partir de la ligne de commande.

Ligne directrice officielle Version 3.0 d'Android Studio

1voto

J'utilisais espresso, et pour cela il fallait utiliser les ressources de l'application, pas celles du test.

Ainsi, au lieu de

InstrumentationRegistry.getInstrumentation().context.resources.getString("key")

J'ai utilisé

activityRule.activity.getString("key")

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