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?

7 Solutions collect form web for “Prueba de que el botón inicia una Actividad con Robolectric”

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 burlar el método antes de que se cree la actividad?
  • Robolectric + rxJava + retrofit Segunda llamada lanza java.io.InterruptedIOException
  • Robolectric 3.0 java.lang.NoSuchMethodException en crear actividad
  • Estoy estudiando Robolectric pero se ha producido un error
  • No se puede crear ActionBarActivity desde Robolectric 2 unidad de prueba
  • Módulos Robolectric y Library con archivos de recursos
  • Recursos de la biblioteca con Robolectric 3 - JodaTime
  • Robolectric Run
  • Cómo probar el servicio remotel
  • Configuración de Deckard para Gradle. Error con la prueba Robolectric
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.