2015-02-24 7 views
6

Ich versuche, Robolectric Tests und arbeiten in unserem aktuellen Projekt, und nicht viel Glück. Meine Präferenz wäre, diese in Android Studio 1.1.0+ laufen zu lassen. Das ist meine Projektstruktur:Manifest und Setup Probleme bekommen Robolectric arbeiten mit Android Studio 1.1.0

enter image description here

und hier ist mein Test:

import android.widget.Button; 

import com.mycompany.android.app.R; 

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.robolectric.Robolectric; 
import org.robolectric.RobolectricTestRunner; 
import org.robolectric.annotation.Config; 

import static org.junit.Assert.assertNotNull; 

@Config(manifest = "AndroidManifest.xml") 
@RunWith(RobolectricTestRunner.class) 
public class SplashActivityTest { 

    private SplashActivity splashActivity; 

    @Before 
    public void setup() { 
     splashActivity = Robolectric.buildActivity(SplashActivity.class).create().start().resume().get(); 
    } 

    @Test 
    public void shouldNotBeNull() { 
     Button signUpButton = (Button) splashActivity.findViewById(R.id.sign_up_button); 
     assertNotNull(signUpButton); 

     Button loginButton = (Button) splashActivity.findViewById(R.id.login_button); 
     assertNotNull(loginButton); 
    } 

} 

Egal, was ich tue, um den Rahmen zu versuchen und zu erhalten, den Test zu finden, indem Sie den Pfad zu dem Manifest zu ändern kann es nicht finden - entweder bekomme ich WARNING: No manifest file found at ./AndroidManifest.xml.Falling back to the Android OS resources only. Nachrichten oder API Level XX is not supported - Sorry! Nachrichten. Am Ende, ich denke, das ist der Grund, warum ich die folgenden Fehler bin immer, wenn der Test läuft:

android.content.res.Resources$NotFoundException: unknown resource 2130903074 

Ich habe nicht die experimentelle Option aktiviert ist, haben das Recht Gradle Plugin konfiguriert (Einheit Tests Arbeit gut), aber ich bin mir nicht sicher, was ich vermisse, um Instrumentierungstests durchführen zu können.

App-Level-Build-Datei:

apply plugin: 'org.robolectric' 

testCompile 'junit:junit:4.12' 
testCompile 'org.mockito:mockito-core:1.9.5' 
testCompile 'org.robolectric:robolectric:2.4' 
testCompile 'org.hamcrest:hamcrest-core:1.1' 
testCompile 'org.hamcrest:hamcrest-library:1.1' 
testCompile 'org.hamcrest:hamcrest-integration:1.1' 

Top-Level-Build-Datei:

dependencies { 
    classpath 'com.android.tools.build:gradle:1.1.0' 
    classpath 'org.robolectric:robolectric-gradle-plugin:1.0.0' 
} 
+0

Nicht ganz sicher Datei ist und Paket zu manifestieren, wenn wir das gleiche Problem haben. Ich wollte Robolectric 2.4 verwenden, aber das funktionierte nicht gut mit Android Studio 1.0.etwas. Am Ende benutze ich immer noch robolectric 2.3. –

Antwort

10

ich einen Schritt für Schritt Anleitung geschrieben, wie mit Android Studio 1.1.0 http://nenick-android.blogspot.de/2015/02/android-studio-110-beta-4-and.html ermöglichen robolectric Ich denke, Sie werden eine Antwort für Ihr Problem finden. Und ein Beispiel https://github.com/nenick/AndroidStudioAndRobolectric

+0

Danke für die Antwort und den Artikel. Es half mir auf jeden Fall, während ich gleichzeitig "angelernt wurde" und mir eine bessere Vorstellung davon gab, wie die Dinge hinter den Kulissen funktionieren. – TheIcemanCometh

2

In Ihrem Fall könnte nächste Änderung helfen:

@Config(manifest = "src/main/AndroidManifest.xml", emulateSdk = 18, reportSdk = 18) 

Aber auch

+0

Das hat mich definitiv näher gebracht - der Pfad und die anderen Attribute auf der Annotation haben definitiv geholfen (jetzt bekomme ich NPEs auf etwas in den Ressourcen). Ich werde in Kürze durch den Führer gehen. – TheIcemanCometh

+0

Ich nehme an, Sie verwenden App compat. Überprüfen Sie den Punkt für den Schatten-Menüeintrag –

+0

Wir verwenden derzeit keine der AppCompat-Bibliotheken, aber eines der Probleme, die ich hatte, war die Definition der Google Play Services-Version im Manifest. Die Dokumentation von Google hat Beispiele, in denen dieser Wert eine ganze Zahl sein sollte, aber die AndroidManifest-Klasse in RE wirft die NPE. Wenn ich die Definition der Version in einen String ändere, scheint das zu gefallen. Seltsam. – TheIcemanCometh

0

ich gerade geändert @nenick führen lesen:

@RunWith(RobolectricTestRunner.class) 

und es funktioniert. All die anderen Konfigurations-Sachen scheinen unnötig zu sein.

2

Nach wenigen Tagen zu kämpfen, ich dachte, schließlich die Ursache für Ihre Frage aus:

WARNING: No manifest file found at ./AndroidManifest.xml.Falling back to the Android OS resources only. messages, or API Level XX is not supported - Sorry! 

Viele Antworten, die ich auf Stackoverflow gefunden mir gesagt, den Weg der Manifest-Datei in den @Config wie folgt hinzufügen :

@Config(manifest = "src/main/AndroidManifest.xml") 

Es hat für eine meiner Projekte arbeiten, aber wenn ich die Testumgebung, die gleiche Fehlermeldung tauchte ein neues Projekt und Einrichtung eröffnet.

Der Grund dafür wäre das unterschiedliche Arbeitsverzeichnis Ihres Projekts. Sie sollten zuerst Ihr Arbeitsverzeichnis suchen und dann den relativen Pfad in Ihrer @Config (maniest = "...") angeben.

Wo finde ich das Arbeitsverzeichnis in Android Studio?

Run -> Edit Configurations -> Junit -> Your Test 
-> Configuration Tab -> **Working directory:** 

mein Arbeitsverzeichnis als Beispiel nehmen, ist mein Arbeitsverzeichnis

"/Users/Bible/AndroidstudioProjects/MVP" 

so der Weg zu meinem AndroidManifest.xml

sein sollte
@Config(manifest = "app/src/main/AndroidManifest.xml") 

Hier gehen Sie! Ich hoffe, diese Antwort kann Ihnen das Leben erleichtern.

+0

Endlich löste ich mein Problem. "Es funktionierte für eines meiner Projekte, aber als ich ein neues Projekt eröffnete und die Testumgebung einrichtete, tauchte die gleiche Fehlermeldung auf." => Mir ist das passiert –

+0

Ich habe deine Antwort nicht gefunden (vielleicht wegen deine Antwort unten). Es hat funktioniert für eines meiner Projekte und ich antwortete hier: https://Stackoverflow.com/a/45571884/4802664 Dann erstellt ein neues Projekt und bekam den gleichen Fehler (dauerte 3 Tage zu beheben, am 3. Tag bekam Deine Antwort).Jetzt werde ich Ihre Antwort in meiner Antwort verlinken. –

0

Wenn Sie das neueste Android Studio (1.2.x) verwenden, verwenden Sie besser RobolectricGradleTestRunner.class Es ist für verschiedene Build-Aromen und Testaromen konzipiert. Sie müssen auch nicht Ihr Quellmanifest angeben. Es wird das Manifest basierend auf Ihrem Build-Flavor, den Sie ausführen, aufnehmen. Dies ist besonders nützlich, wenn Sie unterschiedliche Build-Umgebungen (Staging, Produktion) haben und Ihre Testfälle in einer bestimmten Umgebung ausführen möchten.

2

Ich habe dieselben Fehler festgestellt. Wir verwenden verschiedene Aromen und buildtypes So gibt es Schritte, um es zu machen arbeiten:

1) Android Studiotests laufen Konfiguration

Build Variants menu

Sie müssen festlegen Arbeitsverzeichnis auch zu $ ​​MODULE_DIR $ in Windows . robolectric.org/getting-started sollte das sagen.

Run Configuration Menu

2) Unit-Test wie folgt sein sollte kommentierte:

@RunWith(RobolectricTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 21, manifest = "src/main/AndroidManifest.xml", packageName = "com.example.yourproject") 
public class SomeFragmentTest { 

Hier haben wir schlicht Link

Verwandte Themen