2016-04-20 11 views
7

Ich habe zwei Anwendungen, die über Intents miteinander interagieren. Ich möchte überprüfen, ob App A korrekt die startActivity für App B ruft, ohne tatsächlich starten App B. Ich habe verschiedene Kombinationen von intending ausprobiert und Espresso startet noch App B durch die Absicht, anstatt nur auszudrücken. Dies führt dazu, dass die verbleibenden Tests fehlschlagen, da die Benutzeroberfläche von App B blockiert wird. Irgendwelche Ideen?Fehler beim Stubben mit Espresso

@RunWith(AndroidJUnit4.class) 
@LargeTest 
public class MyActivityUiIntentsTest 
{ 

    @Rule 
    public IntentsTestRule<MyActivity> activityRule = 
      new IntentsTestRule<>(MyActivity.class, true, false); 

    @Test 
    public void shouldStartOtherActivityWhenButtonClicked() 
    { 
     Intents.init(); 
     intending(toPackage("my.package")) 
      .respondWith(new ActivityResult(Activity.RESULT_OK, null)); 

     activityRule.launchActivity(new Intent()); 

     onView(withId(R.id.viewId)).perform(click()); 
     intended(hasComponent(hasShortClassName("the.other.class.name"))); 

     Intents.release(); 
    } 
} 

AKTUALISIERT:-Code für die onClick:

@OnClick(R.id.viewId) 
public void startOtherActivity() 
{ 
    Intent intent = new Intent(); 
    intent.setClassName("my.package", "the.other.class.name"); 
    startActivity(intent); 
    finish(); 
} 
+1

gestartet ist, können wir den Code für Intent Schöpfung im onClick sehen? Und haben Sie Paketnamen auf den Absichten angemeldet? Ie.e Ihre Absicht ist nicht die richtige Absicht zu fangen – Blundell

+0

Hinzugefügt den 'onClick' Beispielcode. – brwngrldev

+0

Auf welcher Device/Emu-API-Version laufen Sie? –

Antwort

3

Ihren intending... Code unten launchActivity Bewegen und .init() entfernen, da die IntentsTestRule init für Sie anrufen, nachdem die Aktivität

+0

Dies behebt das Problem, danke! – brwngrldev

2

Eine der möglichen Lösungen ist indirection haben für Vorsatz Dispatching.

Zum Beispiel haben wir IntentDispatcher, die wir ersetzen mit Test-Implementierung in funktionalen UI-Tests über Trick mit custom instrumentation test runner.

Echt Implementierung von IntentDispatcher nur Anrufe context.startActivity() während in Tests, die wir besondere Aktivität öffnen, die alle Inhalte des Intent zeigt so sind wir in der Lage zu überprüfen, dass es Intent, die wir mit Espresso-Matcher verarbeiten wollte.

Auch wir schrieben Regeln, um Dinge wie das Öffnen der Kamera-App und das Mocking des Ergebnisses zu behandeln oder einfach nur normale startActivity() Anrufe zu verspotten.

+0

Dies ist auch eine gute Idee, danke für den Austausch. – brwngrldev

Verwandte Themen