it-swarm.com.de

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

Von mir verwendete Testklasse, die nicht ausgeführt werden kann:

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

Dies ist der Stack-Trace des Fehlers:

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 dem Edit Configurations Ich habe den Working Directory bis $MODULE_DIR$

Vielen Dank für jeden Vorschlag.

39
ant2009

Wie erwähnt von einem Ingenieur aus dem Google-Team (wahrscheinlich Xavier Ducrohet ), Robolectric hat Probleme mit AAPT2:

Robolectric ist nicht kompatibel mit aapt2.

Zwei Möglichkeiten hier.

Erste Option - folgen Sie Robolectric Richtlinien für Android Studio 3.0 +

Fügen Sie Ihrem build.gradle Folgendes hinzu:

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

Notieren Sie Ihren Test mit dem Robolectric-Testläufer:

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

Zweite Option: AAPT2 deaktivieren und folgende Zeile in die Datei gradle.properties Einfügen:

Android.enableAapt2=false
64
azizbekian

Die Robolectric-Dokumentation besagt, dass die folgende Konfiguration mit Android Studio 3.x) verwendet werden sollte:

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

Wenn Ihr Build aufgrund eines AAPT2 Ressourcenverarbeitungsproblems fehlschlägt oder Sie Roboelectric können Sie AAPT2 deaktivieren, indem Sie Android.enableAapt2=false in Ihrem Datei gradle.properties und Neustart des Gradle-Daemons durch Ausführen von ./gradlew --stop über die Befehlszeile .

Offizielle Richtlinie Android Studio 3.0 Release

2
IntelliJ Amiya

(für alle, die nach einer Lösung für ein ähnliches Problem suchen)


Achten Sie darauf, zu verwenden

RuntimeEnvironment.application

und nicht:

RuntimeEnvironment.systemContext

wenn Sie versuchen, Ressourcen "manuell" aufzulösen.

Das ist ein Fall, in dem Resources$NotFoundException wird möglicherweise mit Robolectric angezeigt.

2
Bartek Lipinski

Ich habe Espresso verwendet, und dafür mussten Sie App-Ressourcen verwenden, nicht Ressourcen testen.

Also statt

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

Ich benutzte

activityRule.activity.getString("key")
1