2014-09-23 13 views
29

il seguente è uno dei miei casi di test Espresso.Espresso - Come posso verificare se un'attività viene avviata dopo aver eseguito una determinata azione?

public void testLoginAttempt() { 
     Espresso.onView(ViewMatchers.withId(R.id.username)).perform(ViewActions.clearText()).perform(ViewActions.typeText("[email protected]")); 
     Espresso.onView(ViewMatchers.withId(R.id.username)).perform(ViewActions.clearText()).perform(ViewActions.typeText("invalidpassword")); 

     Espresso.onView(ViewMatchers.withId(R.id.login_button)).perform(ViewActions.click()); 
     // AFTER CLICKING THE BUTTON, A NEW ACTIVITY WILL POP UP. 
     // Clicking launches a new activity that shows the text entered above. You don't need to do 
     // anything special to handle the activity transitions. Espresso takes care of waiting for the 
     // new activity to be resumed and its view hierarchy to be laid out. 
     Espresso.onView(ViewMatchers.withId(R.id.action_logout)) 
       .check(ViewAssertions.matches(not(ViewMatchers.isDisplayed()))); 

    } 

Attualmente quello che ho fatto è stato quello di verificare se una vista nella nuova attività (R.id.action_logout) è visibible oppure no. Se visibile, assumerò che l'attività sia stata aperta con successo. Ma non sembra funzionare come mi aspettavo. C'è un modo migliore per verificare se una nuova attività è stata lanciata correttamente invece di controllare una vista in quella attività è visibile? Grazie

+0

Perché non si importa ViewMatchers?'Importa statico android.support.test.espresso.matcher.ViewMatchers. *' – Roel

+0

@ user2062024 Puoi pubblicare il codice funzionante? –

+0

L'Espresso più nuovo attende automaticamente Asyntask. – WenChao

risposta

6

Il problema è che l'applicazione esegue l'operazione di rete dopo aver fatto clic sul pulsante di accesso. Espresso non gestisce (aspetta) le chiamate di rete per finire di default. Devi implementare il tuo IdlingResource personalizzato che bloccherà l'Espresso dal procedere con i test fino a quando IdlingResource ritorna allo stato inattivo, il che significa che la richiesta di rete è terminata. Date un'occhiata a pagina campioni Espresso - https://google.github.io/android-testing-support-library/samples/index.html

+0

Aggiornamento del collegamento obsoleto – denys

7

Prova con

intended(hasComponent(new ComponentName(getTargetContext(), ExpectedActivity.class))); 

Guarda response from @riwnodennyk

+1

Perché è necessario 'new ComponentName'? –

35

È possibile utilizzare:

intended(hasComponent(YourExpectedActivity.class.getName())); 

Richiede questa voce Gradle:

androidTestCompile ("com.android.support.test.espresso:espresso-intents:$espressoVersion") 

L'importazione per l'intended() e hasComponent()

import static android.support.test.espresso.intent.Intents.intended; 
import static android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent; 
-3
@RunWith(RobolectricTestRunner.class) 
public class WelcomeActivityTest { 

    @Test 
    public void clickingLogin_shouldStartLoginActivity() { 
     WelcomeActivity activity = Robolectric.setupActivity(WelcomeActivity.class); 
     activity.findViewById(R.id.login).performClick(); 

     Intent expectedIntent = new Intent(activity, LoginActivity.class); 
     assertThat(shadowOf(activity).getNextStartedActivity()).isEqualTo(expectedIntent); 
    } 
} 
+1

La domanda riguarda Espresso, non Robolectric. – Allison

3

Si può farlo nel seguente modo:

@Test 
public void testLoginAttempt() { 
    Espresso.onView(ViewMatchers.withId(R.id.username)).perform(ViewActions.clearText()).perform(ViewActions.typeText("[email protected]")); 
    Espresso.onView(ViewMatchers.withId(R.id.username)).perform(ViewActions.clearText()).perform(ViewActions.typeText("invalidpassword")); 

    Intents.init(); 
    Espresso.onView(ViewMatchers.withId(R.id.login_button)).perform(ViewActions.click()); 
    Intents.release(); 
} 

java.lang.NullPointerException viene generata se Intents.init() non viene chiamato.

0

assicurarsi che la libreria intento Expresso è nelle dipendenze Gradle

androidTestImplementation "com.android.support.test.espresso:espresso-intents:3.0.1" 

Poi importare questi due nel vostro file di prova

import android.support.test.espresso.intent.Intents.intended 
import android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent 

Quindi aggiungere IntentsTestRule nella classe di test

@Rule 
@JvmField 
val mainActivityRule = IntentsTestRule(MainActivity::class.java) 

Infine controlla che l'attività abbia avviato l'intento

@Test 
fun launchActivityTest() { 
    onView(ViewMatchers.withId(R.id.nav_wonderful_activity)) 
      .perform(click()) 

    intended(hasComponent(WonderfulActivity::class.java!!.getName())) 
} 
3

Prova:

intended(hasComponent(YourActivity.class.getName()));

Inoltre, tenete a mente

java.lang.NullPointerException viene generata se Intents.init() non viene chiamato prima intended()

Problemi correlati