web-dev-qa-db-fra.com

Espresso - Comment puis-je vérifier si une activité est lancée après une action donnée?

voici un de mes tests Espresso.

    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())));

    }

Actuellement, je vérifiais si une vue de la nouvelle activité (R.id.action_logout) était visible ou non. Si visible, je supposerai que l'activité s'est ouverte avec succès. Mais cela ne semble pas fonctionner comme prévu. Existe-t-il un meilleur moyen de vérifier si une nouvelle activité est lancée avec succès au lieu de vérifier qu'une vue est visible? Merci

55
user2062024

Vous pouvez utiliser:

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

Nécessite cette entrée de grade:

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

L'import pour la intended() et hasComponent()

import static Android.support.test.espresso.intent.Intents.intended;
import static Android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent;

comme mentionné par Shubam Gupta, rappelez-vous d'appeler Intents.init() avant d'appeler intended(). Vous pouvez éventuellement l'appeler dans la méthode @Before.

63
baskara

Essayer:

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

Aussi, gardez à l'esprit

Java.lang.NullPointerException Est levé si Intents.init() n'est pas appelée avant intended()

15
Shubham Gupta

Essayer avec

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

Regardez réponse de @riwnodennyk

7
lujop

Assurez-vous que la bibliothèque d'intentions Espresso se trouve dans les dépendances de gradles.

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

Puis importez ces deux dans votre fichier de test

import static Android.support.test.espresso.intent.Intents.intended
import static Android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent

Ajoutez ensuite IntentsTestRule dans votre classe de test

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

Enfin, vérifiez que l'activité a été lancée

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

    intended(hasComponent(WonderfulActivity::class.Java!!.getName()))
}
7
s-hunter

Le problème est que votre application exécute l'opération réseau une fois que vous avez cliqué sur le bouton de connexion. Espresso ne gère pas (attend) les appels réseau pour se terminer par défaut. Vous devez implémenter votre IdlingResource personnalisée, ce qui empêchera Espresso de poursuivre les tests jusqu'à ce que IdlingResource revienne à l'état inactif, ce qui signifie que la requête réseau est terminée. Jetez un coup d’œil à la page d’échantillons Espresso - https://google.github.io/Android-testing-support-library/samples/index.html

7
denys

Vous pouvez le faire comme suit:

    @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 Est levé si Intents.init() n'est pas appelé.

6
Abdul Wadood

J'utilise cette approche:

// The IntentsTestRule class initializes Espresso Intents before each test, terminates the Host activity, and releases Espresso Intents after each test
    @get:Rule
    var tradersActivity: IntentsTestRule<TradersActivity> = IntentsTestRule(TradersActivity::class.Java)
    @get:Rule
    var jsonViewActivity: IntentsTestRule<JsonViewActivity> = IntentsTestRule(JsonViewActivity::class.Java)

    @Test
    fun scrollToItemAndClick() {
     onView(withId(R.id.tradersRecyclerView)).perform(RecyclerViewActions.actionOnItemAtPosition<RecyclerView.ViewHolder>(ITEM_POS, click()))

        // check is activity was started
        intended(hasComponent(JsonViewActivity::class.Java.getName()))
    }
0
a_subscriber