Эспрессо. Как я могу проверить, запускается ли действие после выполнения определенного действия?

Ниже приведен один из моих тестовых случаев эспрессо.

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

    }

В настоящее время я проверял, отображается ли представление в новой активности (R.id.action_logout) или нет. Если он виден, я буду считать, что активность успешно открыта. Но, похоже, это не работает, как я ожидал. Есть ли лучший способ проверить, успешно ли запущено новое действие, вместо того, чтобы проверять, видимо ли представление в этом действии? Спасибо


person user2062024    schedule 23.09.2014    source источник
comment
Почему вы не импортируете ViewMatcher? import static android.support.test.espresso.matcher.ViewMatchers.*   -  person Roel    schedule 02.02.2015
comment
@ user2062024 Можете ли вы опубликовать рабочий код?   -  person Sudheesh Mohan    schedule 16.02.2016
comment
Самый новый эспрессо будет автоматически ждать Asyntask.   -  person WenChao    schedule 29.05.2016


Ответы (8)


Ты можешь использовать:

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

Требуется эта запись градиента:

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

Импорт для intended() и hasComponent()

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

как упоминал Шубам Гупта, не забудьте позвонить Intents.init() перед тем, как звонить intended(). В конечном итоге вы можете вызвать его в методе @Before.

person baskara    schedule 08.03.2016
comment
хм, в настоящее время официальные документы Android не упоминают Intents.init(), и в моем единственном случае он отлично работает без этого. Какое же тогда правильное решение? - person Antek; 13.12.2018
comment
Наконец, вам нужно выпустить Intents в течение @After, как Intents.release() - person dgngulcan; 16.09.2019
comment
Если вы новичок в этом, обязательно прочитайте ответ Шубхама ниже. - person DavidR; 13.01.2021

Пытаться:

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

Кроме того, имейте в виду

java.lang.NullPointerException вызывается, если Intents.init() не вызывается до intended()

person Shubham Gupta    schedule 14.12.2017
comment
Спасибо за упоминание об init()! - person Quintin Balsdon; 13.06.2018

Вы можете сделать это следующим образом:

    @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 выбрасывается, если Intents.init() не вызывается.

person Abdul Wadood    schedule 14.07.2017

Убедитесь, что библиотека намерений Espresso находится в зависимостях gradle.

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

Затем импортируйте эти два в свой тестовый файл.

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

Затем добавьте IntentsTestRule в свой тестовый класс.

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

Наконец, проверьте, что активность запустила намерение

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

    intended(hasComponent(WonderfulActivity::class.java!!.getName()))
}
person s-hunter    schedule 27.11.2017

Проблема в том, что ваше приложение выполняет сетевую операцию после того, как вы нажмете кнопку входа в систему. Эспрессо не обрабатывает (ожидает) завершения сетевых вызовов по умолчанию. Вы должны реализовать свой собственный IdlingResource, который будет блокировать Espresso от выполнения тестов до тех пор, пока IdlingResource не вернется обратно в состояние ожидания, что означает, что сетевой запрос завершен. Взгляните на страницу образцов эспрессо — https://google.github.io/android-testing-support-library/samples/index.html

person denys    schedule 03.10.2014
comment
Обновил устаревшую ссылку - person denys; 23.06.2017

Попробуйте с

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

Посмотрите на ответ от @riwnodennyk

person lujop    schedule 13.02.2016
comment
Зачем нужен new ComponentName? - person IgorGanapolsky; 22.06.2017

Я использую этот подход:

// 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()))
    }
person a_subscriber    schedule 08.04.2019

person    schedule
comment
Вопрос об Эспрессо, а не о Robolectric. - person Allison; 21.06.2017