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