Подтвердить что ты не робот

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

следующее из моих тестовых случаев 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())));

    }

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

4b9b3361

Ответ 1

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

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

Требуется эта запись Gradle:

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.

Ответ 2

Try:

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

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

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

Ответ 3

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

Ответ 4

Попробуйте

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

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

Ответ 5

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

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

Ответ 6

Убедитесь, что библиотека намерений 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()))
}

Ответ 7

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

// 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()))
    }

Ответ 8

Я пытаюсь это:

@RunWith(AndroidJUnit4::class)
@SmallTest
class TradersActivityTest {   

    @Rule
    @JvmField
    var activityActivityTestRule = ActivityTestRule(TradersActivity::class.java)

    @Rule
    @JvmField
    var jsonViewActivity = ActivityTestRule(JsonViewActivity::class.java)

    @Test
    fun itemListviewJsonButtonClick() {
        onView(withId(R.id.tradersRecyclerView))
                .perform(RecyclerViewActions.scrollToPosition<RecyclerView.ViewHolder>(CHECK_ITEM_LIST_POS));
        onView(withRecyclerView(R.id.tradersRecyclerView).atPositionOnView(CHECK_ITEM_LIST_POS, R.id.viewJsonButton))
                .perform(click())
        // check the activity has launched intent
        Intents.init()
        intended(hasComponent(JsonViewActivity::class.java.getName()))
        Intents.release()
    }

Но я получаю ошибку:

Started running tests

androidx.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: Wanted to match 1 intents. Actually matched 0 intents.

IntentMatcher: has component: has component with: class name: is "com.myproject.ui.activity.JsonViewActivity" package name: an instance of java.lang.String short class name: an instance of java.lang.String

Matched intents:[]

Recorded intents:[]
at dalvik.system.VMStack.getThreadStackTrace(Native Method)
at java.lang.Thread.getStackTrace(Thread.java:580)
at androidx.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:96)
at androidx.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:59)
at androidx.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:318)
at androidx.test.espresso.ViewInteraction.check(ViewInteraction.java:300)
at androidx.test.espresso.intent.Intents.intended(Intents.java:190)
at androidx.test.espresso.intent.Intents.intended(Intents.java:170)
at com.myproject.android.activity.TradersActivityTest.itemListviewJsonButtonClick(TradersActivityTest.kt:440)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:531)
at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:531)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:104)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:389)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1879)

Ответ 9

@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);
    }
}