Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Robolectric: Resources$NotFoundException: String resource ID with 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' 

Test class that I am using that fails to run:

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

This is the stack trace of the error:

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) 

In the Edit Configurations I have set the Working Directory to $MODULE_DIR$

Many thanks for any suggestion.

like image 853
ant2009 Avatar asked Aug 28 '17 15:08

ant2009


2 Answers

As mentioned by an engineer from Google team (most possibly Xavier Ducrohet), Robolectric has issues with AAPT2:

Robolectric is not compatible with aapt2.

Two options here.

First option - follow Robolectric guidelines for Android Studio 3.0+

Add the following to your build.gradle:

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

Annotate your test with the Robolectric test runner:

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

Second option: disable AAPT2 adding following line into gradle.properties file:

android.enableAapt2=false 
like image 189
azizbekian Avatar answered Sep 20 '22 23:09

azizbekian


The Robolectric documentation states that the following configuration should be used with Android Studio 3.x:

android {   testOptions {     unitTests.includeAndroidResources true   } } 
like image 20
sfera Avatar answered Sep 21 '22 23:09

sfera