web-dev-qa-db-fra.com

Robolectric: Resources $ NotFoundException: ID de ressource de chaîne 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 parvient pas à s'exécuter:

@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()));
    }
}

C'est 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 à $MODULE_DIR$

Merci beaucoup pour toute suggestion.

39
ant2009

Comme mentionné 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 - suivez Robolectric recommandations pour Android Studio 3.0 +

Ajoutez les éléments suivants à votre build.gradle:

Android {
  testOptions {
    unitTests {
      includeAndroidResources = true
    }
  }
}

Annotez votre test avec le programme d’essai Robolectric:

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

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

Android.enableAapt2=false
64
azizbekian

Le documentation Robolectric indique que la configuration suivante doit être utilisée avec Android Studio 3.x:

Android {
  testOptions {
    unitTests.includeAndroidResources true
  }
}
6
sfera

Si votre construction échoue à cause d'un AAPT2 _ problème de traitement de la ressource ou que vous souhaitez utiliser Roboelectric, vous pouvez désactiver AAPT2 en définissant Android.enableAapt2=false dans votre gradle.properties _ fichier et redémarrage du démon Gradle en exécutant ./gradlew --stop à partir de la ligne de commande.

Directive officielle version Android Studio 3.

2
IntelliJ Amiya

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


Assurez-vous d'utiliser

RuntimeEnvironment.application

et not:

RuntimeEnvironment.systemContext

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

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

2
Bartek Lipinski

J'utilisais un expresso et pour cela, vous deviez utiliser les ressources de l'application, pas les ressources de test.

Donc au lieu de

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

J'ai utilisé

activityRule.activity.getString("key")
1
app developer 27