tutorial studio android android-activity android-intent robolectric

android - studio - robolectric gradle



Al probar ese botón se inicia una actividad con Robolectric (7)

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());

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 idea de cómo probar que al pulsar pressMeButton comenzó una nueva actividad. En realidad, sí, ¿pero cómo escribir la prueba de unidad Robolectric correcta para este hecho?


Al no haber usado ninguna de las pruebas unitarias en Android, no estoy seguro si esto funcionará:

En la actividad que está iniciando, puede crear una variable estática llamada "instancia".

private static TheActivitysName instance;

En la actividad onCreate estableces la variable de instancia:

instance = this;

Y luego creas 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, entonces la actividad no se ha iniciado. Si es diferente de nulo, entonces la actividad ha sido creada.

No estoy seguro de si el código para verificar se ejecutará antes de que la actividad haya tenido tiempo de crearse.


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));


En Robolectric 2.1.1 puede verificar si la Intent iniciar nueva Activity fue emitida 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 crear Activity invocando new Activity() hará que Robolectric imprima advertencias sobre la creación de actividad de forma incorrecta, esto probablemente se puede hacer mejor ...


Inspirado por la respuesta de @MicK, aquí hay una prueba de funcionamiento 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))); }


Use StartedMatcher 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)); } }


@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 Exception { Thread.sleep(5000); hourlyButton.performClick(); Intent intent = shadowActivity.peekNextStartedActivityForResult().intent; assertThat(intent.getComponent()).isEqualTo(new ComponentName(mMainActivity, HourlyForecastActivity.class)); }