2016-04-20 11 views
7

Ho due applicazioni che interagiscono tra loro tramite intenti. Vorrei verificare che diciamo che App A chiama correttamente lo startActivity per App B senza effettivamente avviare App B. Ho provato varie combinazioni di intending e Espresso lancia ancora App B attraverso l'intento invece di spegnerlo. Ciò causa il fallimento dei test rimanenti in quanto l'interfaccia utente viene bloccata dall'app B. Qualche idea?durante la stubazione con 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(); 
    } 
} 

AGGIORNAMENTO: Codice in materia di onClick:

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

Possiamo vedere il codice per la creazione di intenti nel onClick? E hai registrato i nomi dei pacchetti sugli intenti? Il tuo intendimento non sta catturando l'intento corretto – Blundell

+0

Aggiunto il codice di esempio 'onClick'. – brwngrldev

+0

Che versione di dispositivo/emu API stai usando? –

risposta

3

spostare il codice qui sotto intending... launchActivity e rimuovere .init() perché il IntentsTestRule chiamerà init per voi dopo l'attività viene lanciato

+0

Questo risolve il problema, grazie! – brwngrldev

2

Una delle possibili soluzioni è quello di avere indirezione per dolo dispacciamento.

Ad esempio, abbiamo IntentDispatcher che sostituiamo con l'implementazione di test in test di interfaccia utente funzionale tramite trucco con custom instrumentation test runner.

reale attuazione IntentDispatcher chiama proprio context.startActivity() mentre nei test apriamo speciale attività che consente di visualizzare tutti i contenuti della Intent così siamo in grado di verificare che si trattava di Intent che volevamo trattare con matchers Espresso.

Inoltre abbiamo scritto un sacco di regole per gestire cose come l'apertura di app fotocamera e il risultato beffardo o semplicemente prendendo in giro le chiamate regolari startActivity().

+0

Questa è anche una buona idea, grazie per averla condivisa. – brwngrldev