Prueba de que el botón inicia una Actividad con Robolectric
Hola Tengo el siguiente código:
@RunWith(Test9Runner.class) public class MainActivityTest { private MainActivity activity; private Button pressMeButton; @Before public void setUp() throws Exception { activity = new MainActivity(); activity.onCreate(null); pressMeButton = (Button) activity.findViewById(R.id.button1); } @Test public void shouldUpdateResultsWhenButtonIsClicked() throws Exception { pressMeButton.performClick(); ShadowActivity shadowActivity = shadowOf(activity); Intent intent = shadowActivity.getResultIntent(); System.out.print(intent.toString()); } }
Pero no tengo ni idea de cómo probar que presionando pressMeButton inició una nueva Actividad. En realidad lo hace, pero ¿cómo escribir la prueba correcta Robolectric unidad para este hecho?
- Prueba de tareas asíncronas con robolectric
- Casos de prueba de unidad con JUnit + (Robolectric o Mockito o ambos en Android)
- Robolectric: Pruebas con ormlite
- Robolectric app testing con Firebase
- ¿Puede jmockit y robolectric coexistir?
- Recursos $ NotFoundException al usar Robolectric con Gradle
- Obtención del campo `ViewDataBinding` de actividad dentro de la prueba de unidad 'Robolectric` después de ser asignado
- Android - Prueba de un recurso de cadena con Robolectric
- Manifiesto y problemas de configuración para conseguir que Robolectric trabaje con Android Studio 1.1.0
- Prueba de unidad de Android con Retrofit2 y Mockito o Robolectric
- Robolectric falla al inflar el archivo de diseño si hay una vista personalizada
- ¿Puedo usar Cobertura en pruebas de unidad con PowerMock?
- Robolectric 3.0: Mocking System.currentTimeMillis ()
Utilice el IniciadoMatcher de StartedMatcher
@RunWith(Test9Runner.class) public class MainActivityTest { private MainActivity activity; private Button pressMeButton; @Before public void setUp() throws Exception { activity = new MainActivity(); activity.onCreate(null); pressMeButton = (Button) activity.findViewById(R.id.button1); } @Test public void shouldStartNextActivityWhenButtonIsClicked() { pressMeButton.performClick(); assertThat(activity, new StartedMatcher(NextActivity.class)); } }
En Robolectric 2.1.1 se puede verificar si Intent
iniciar nueva Activity
se emitió de la siguiente manera.
@RunWith(RobolectricTestRunner.class) public class MyTest { private ShadowActivity shadowActivity; private MyActivity activity; @Before public void setup() { activity = new MyActivity(); shadowActivity = Robolectric.shadowOf(activity); } @Test public shouldStartNewActivityWhenSomething() { //Perform activity startup //Do some action which starts second activity, for example View::performClick() //... //Check Intent Intent intent = shadowActivity.peekNextStartedActivityForResult().intent; assertThat(intent.getStringExtra(MySecondActivity.EXTRA_MESSAGE)).isEqualTo("blebleble"); assertThat(intent.getComponent()).isEqualTo(new ComponentName(activity, MySecondActivity.class)); } }
Esto es similar a lo que estoy haciendo. Tenga en cuenta que al crear Activity
llamando a la new Activity()
, Robolectric imprimirá advertencias sobre la creación de actividad incorrectamente, esto probablemente se puede hacer mejor …
Inspirado en la respuesta de @ MichK, aquí hay una prueba de ejecución completa usando la cadena de métodos buildActivity de Robolectric 2.2+:
@Test public void testStartScheduleActivity() { HomeScreenActivity homeActivity = Robolectric.buildActivity(HomeScreenActivity.class).create().start().visible().get(); ShadowActivity shadowHome = Robolectric.shadowOf(homeActivity); Button btnLaunchSchedule = (Button) homeActivity.findViewById(R.id.btnLaunchSchedule); Robolectric.clickOn(btnLaunchSchedule); assertThat(shadowHome.peekNextStartedActivityForResult().intent.getComponent(), equalTo(new ComponentName(homeActivity, ScheduleActivity.class))); }
Actualizar esto para 3.1.2 como las respuestas anteriores no funcionó para mí: –
loginButton.callOnClick(); Intent startedIntent = shadowOf(activity).getNextStartedActivity(); ShadowIntent shadowIntent = shadowOf(startedIntent); assertEquals(NextActivity.class, shadowIntent.getIntentClass());
@Before public void setUp() throws Exception { mMainActivity = Robolectric.buildActivity(MainActivity.class) .create().start().visible().get(); shadowActivity =Shadows.shadowOf(mMainActivity); hourlyButton = (Button) mMainActivity.findViewById(R.id.hourlyButton); }
@Test public void hourlyActivityButtonTest () throws Excepción {
Thread.sleep(5000); hourlyButton.performClick(); Intent intent = shadowActivity.peekNextStartedActivityForResult().intent; assertThat(intent.getComponent()).isEqualTo(new ComponentName(mMainActivity, HourlyForecastActivity.class)); }
Así es como se ve para el Robolectric 3
// Click on the image view mShareLocationImageView.performClick(); // Check the startActivityForResult for ShareUserLocationActivity has been triggered ShadowActivity shadowActivity = Shadows.shadowOf(mChatWindowsActivity); Intent intent = shadowActivity.peekNextStartedActivityForResult().intent; assertThat(intent).hasComponent(new ComponentName(mChatWindowsActivity, ShareUserLocationActivity.class));
Después de no haber utilizado ninguna de las pruebas de unidad en android, no estoy seguro de si esto funcionará:
En la actividad que está iniciando, podría crear una variable estática llamada "instancia".
private static TheActivitysName instance;
En la actividad onCreate se establece la variable de instancia:
instance = this;
Y luego se crea un método estático para obtener esta variable.
public static TheActivitysName getInstance() { return instance; }
En su prueba, puede probar en TheActivitysName.getInstance (). Si es nulo, la actividad no se ha iniciado. Si es diferente de null, entonces la actividad se ha creado.
No estoy seguro de si el código para comprobar se ejecutará antes de que la actividad ha tenido tiempo para ser creado sin embargo.
- Contexto de la aplicación SharedPreferences vs contexto de la actividad
- Cómo capturar y guardar una imagen con cámara personalizada en Android?