17

Ich versuche eine Aktivität zu testen, die ActionBarActivity verwendet (aus der appcompat-Bibliothek). Ich brauche eine benutzerdefinierte Anwendung, um das DI-System manipulieren zu können, um meinen Testdienst anstelle des echten Dienstes zu laden.ActivityUnitTestCase und startActivity mit ActionBarActivity

Wenn ich meinen Test geschrieben und ruft startActivity ich die folgende Fehlermeldung erhalten:

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. 

Wenn ich launchActivityWithIntent rufe die Aktivität beginnt ohne Probleme, aber es ist meine Real Application-Klasse anstelle der verspott Anwendungsklasse . Irgendwelche Ideen, wie ich das beheben kann oder wie ich nach onCreate der Anwendung Code ausführen kann, wurden aufgerufen, aber bevor onCreate of my Activity in meinem Instrumententest aufgerufen wird?

Antwort

2

Ich fand heraus, dass, wenn ich eine benutzerdefinierte MockApplication und fügen Sie den folgenden Code zu erstellen:

@Override 
public void onCreate() { 
    super.onCreate(); 
    setTheme(R.style.AppTheme); 
} 

Ich hoffe, dass auch für andere Menschen arbeiten.

+0

ich ähnliches Problem konfrontiert bin, aber ich konnte es nicht zur Arbeit kommen. Könnten Sie Ihr Ergebnis teilen? – RobGThai

+1

Wie ich schon sagte, habe ich eine Klasse erstellt, die MockApplication erweitert. Dann habe ich die Methode OnCreate mit dem obigen Snippet überschrieben und dann eine Instanz dieser Mock-Application-Klasse, die ich in der ActivityUnitTestCase-Klasse erstellt habe – fkrauthan

+0

Dies funktionierte für mich :) –

24

Die akzeptierte Antwort funktionierte nicht in meinem Fall, aber mit etwas für mich in der ActicityUnitTestCase Unterklasse gearbeitet:

@Override 
public void setUp(){ 
    ContextThemeWrapper context = new ContextThemeWrapper(getInstrumentation().getTargetContext(), R.style.AppTheme); 
    setActivityContext(context); 
} 
+0

Weißt du, wie man das mit roboelectric funktioniert? – gaara87

+0

@AkashRamani hast du es für Roboelec herausgefunden? Ich habe das gleiche Problem – user3137376

+0

Nein, tut mir leid: / – gaara87

0

Denken Sie daran, dass wir sollen wieder verwendbare Aktivitäten schaffen und durch das Thema in der Einstellung onCreate Methode verbinden wir die Aktivität mit dem AppTheme.

Die Antwort von @Akira Speirs ist meiner Meinung nach die beste Option, obwohl wir daran denken müssen, den Test zu aktualisieren, wenn das Thema im AndroidManifest geändert wird.

0

ActivityUnitTestCase.startActivity ruft setActivity vor dem Abarbeiten onCreate so Code unten funktioniert der Trick:

@Override 
protected void setActivity(Activity testActivity) { 
    if (testActivity != null) testActivity.setTheme(R.style.AppTheme); 
    super.setActivity(testActivity); 
} 

Dies ist eine Alternative zur Lösung von @Akira Speirs beispielsweise vorgesehen sein könnte, wenn benutzerdefinierte Kontext verwendet werden muss.

0

In meinem Fall habe ich eine benutzerdefinierte Komponente als Teil eines Layouts getestet.

Nur getActivity().setTheme(...) in der setUp() des Tests angerufen arbeitete für mich.

Ich bekam auch this error beim Testen auf einem echten Gerät.

Allerdings Tests mit einem API-Level 23 x86-Emulator mit HAXM aktiviert es funktioniert und ist schön und schnell.

Hier ist eine vollständigere setUp() Verfahren als Beispiel:

@Override 
public void setUp() throws Exception { 

    super.setUp(); 

    startActivity(new Intent(getInstrumentation().getTargetContext(), Activity.class), null, null); 

    getActivity().setTheme(R.style.MyAppTheme); 

    getActivity().setContentView(R.layout.my_layout_under_test); 

} 
Verwandte Themen