2015-05-06 6 views
10

Gibt es eine gute Möglichkeit, den Ergebniscode und die Daten in einem Android Espresso-Test zu testen? Ich benutze Espresso 2.0.Wie kann ich setResult() in einem Android Espresso-Test testen?

Angenommen, ich habe eine Activity namens BarActivity.class, die bei Ausführung einer Aktion setResult(int resultCode, Intent data) mit der entsprechenden Nutzlast ruft.

Ich möchte einen Testfall schreiben, um die resultCode und data zu verifizieren. Da setResult() jedoch eine final Methode ist, kann ich sie nicht überschreiben.

Einige Optionen Ich dachte waren:

  • eine neue Methode wie setActivityResult() definieren und verwenden Sie nur, dass so kann es, etc abgefangen werden ...
  • schreiben Test nur TestActivity die startActivityForResult() nennen auf BarActivity und das Ergebnis in TestActivity.onActivityResult()

zu denken versuchen, was die beiden Übeln weniger ist, oder wenn andere Vorschläge gibt es, wie dies zu testen. Irgendwelche Vorschläge? Vielen Dank!

+0

Hier ist eine Teillösung für Option 2: https://product.reverb.com/2016/03/12/testing-android-activity-results/ Allerdings nicht vollständig, zumindest habe ich es nicht geschafft zu machen es funktioniert. – friedger

Antwort

5

Wenn Sie auf 2.1 bereit zu aktualisieren sind, dann schauen Sie sich Espresso-Intents nehmen:

die Absicht-API (Cousin von Mockito.when), können Sie eine Antwort für Tätigkeiten, die mit startActivityForResult gestartet werden

Diese im Grunde bedeutet es möglich ist, jedes Ergebnis zu bauen und zurück, wenn eine spezifische Aktivität (in Ihrem Fall der BarActivity Klasse) gestartet wird.

prüfen dieses Beispiel hier: https://google.github.io/android-testing-support-library/docs/espresso/intents/index.html#intent-stubbing

Und auch my answer auf einem etwas ähnliches Problem (aber mit dem Kontakt Picker-Aktivität), in dem ich zeigen, wie ein Ergebnis zu bauen und es zurück in die Aktivität senden, die genannt startActivityForResult()

+2

Ich sehe nicht, wie man die setResult-Methode mit Espresso-Intents testet. Könnten Sie das klären? – friedger

10

Wenn mittlerweile auf die neueste Espresso, Version 3.0.1 eingeschaltet, können Sie einfach eine ActivityTestRule verwenden und die Aktivität Ergebnis wie diese:

assertThat(rule.getActivityResult(), hasResultCode(Activity.RESULT_OK)); 
assertThat(rule.getActivityResult(), hasResultData(IntentMatchers.hasExtraWithKey(PickActivity.EXTRA_PICKED_NUMBER))); 

Sie können ein funktionierendes Beispiel here finden.

+1

Dies ist definitiv der sauberste Weg, solange Sie zu 3.0.1 gehen können. – skeeve

+0

Wenn 'hasResultCode' und' hasResultData' nicht aufgelöst werden können. Fügen Sie "androidTestCompile" com.android.support.test.espresso: espresso-contrib: 3.0.1'' in build.gradle hinzu – Paglian