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.
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
Le documentation Robolectric indique que la configuration suivante doit être utilisée avec Android Studio 3.x:
Android {
testOptions {
unitTests.includeAndroidResources true
}
}
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.
(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
.
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")