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), или нет. Если видишь, я буду считать, что активность открыта успешно.
Но, похоже, он работает не так, как я ожидал.
Есть ли лучший способ проверить, успешно ли запущена новая активность, а не проверять вид в этой активности?
Благодаря
Ответы
Ответ 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);
}
}