android - tareas - Espresso: ¿cómo puedo verificar si una actividad se lanza después de realizar una determinada acción?
retraso de tareas en project (7)
Asegúrese de que la biblioteca de intención Espresso encuentre en las dependencias gradle
androidTestImplementation "com.android.support.test.espresso:espresso-intents:3.0.1"
Luego importe estos dos en su archivo de prueba
import static android.support.test.espresso.intent.Intents.intended
import static android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent
A continuación, agregue IntentsTestRule en su clase de prueba
@Rule
@JvmField
val mainActivityRule = IntentsTestRule(MainActivity::class.java)
Por último, compruebe que la actividad ha lanzado intención
@Test
fun launchActivityTest() {
onView(ViewMatchers.withId(R.id.nav_wonderful_activity))
.perform(click())
intended(hasComponent(WonderfulActivity::class.java!!.getName()))
}
el siguiente es uno de mis casos de prueba 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())));
}
Actualmente, lo que hice fue verificar si una vista en la nueva actividad (R.id.action_logout) es visible o no. Si es visible, asumiré que la actividad se abrió con éxito. Pero no parece funcionar como esperaba. ¿Hay una mejor manera de verificar si una actividad nueva se lanzó exitosamente en lugar de verificar que una vista en esa actividad esté visible? Gracias
El problema es que su aplicación realiza la operación de red después de hacer clic en el botón de inicio de sesión. Espresso no maneja (espera) las llamadas de red para finalizar de manera predeterminada. Debe implementar su IdlingResource personalizada, que impedirá que Espresso continúe con las pruebas hasta que IdlingResource regrese en estado Inactivo, lo que significa que la solicitud de red ha finalizado. Eche un vistazo a la página de muestras de Espresso - https://google.github.io/android-testing-support-library/samples/index.html
Prueba con
intended(hasComponent(new ComponentName(getTargetContext(), ExpectedActivity.class)));
Mira la respuesta de @riwnodennyk
Puedes hacerlo de la siguiente manera:
@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
se lanza si no se llama a Intents.init()
.
Puedes usar:
intended(hasComponent(YourExpectedActivity.class.getName()));
Requiere esta entrada gradle:
androidTestCompile ("com.android.support.test.espresso:espresso-intents:$espressoVersion")
La importación para el intended()
y hasComponent()
import static android.support.test.espresso.intent.Intents.intended;
import static android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent;
como lo menciona Shubam Gupta, recuerde llamar a Intents.init()
antes de llamar a la intended()
. Eventualmente puede llamarlo en el método @Before
.
Tratar:
intended(hasComponent(YourActivity.class.getName()));
Además, ten en cuenta
java.lang.NullPointerException
se lanza si Intents.init()
no se llama antes de lo intended()
@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);
}
}