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?

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.

  • No se pudieron determinar las dependencias para todas las tareas con robolectric gradle plugin
  • Cómo utilizar gradle-android-test-plugin
  • Robolectric ContentProvider testing
  • Java.lang.IllegalStateException: debe haber habido alguna superposición para resourceIdToResName
  • El RoboAttributeSet de Robolectric nunca se lee
  • ¿Cómo puedo detectar con Robolectric que onBackPressed se llama programáticamente?
  • Proporcionando datos de prueba para SharedPreferences para Robolectric
  • Robolectric filenotFound en archivos de activos
  • Robolectric + Gradle falla cuando se inicia la prueba
  • Android Robolectric y elementos decorativos vectoriales
  • Prueba de base de datos SQLite en Robolectric
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.