47 votes

Le test de ce bouton démarre une activité avec Robolectric

Salut j'ai le code suivant :

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

Mais je ne sais pas comment tester qu'appuyer sur pressMeButton a démarré une nouvelle activité. En fait, c'est le cas, mais comment écrire le bon test unitaire robolectrique pour ce fait ?

30voto

MichK Points 549

Dans Robolectric 2.1.1, vous pouvez vérifier si Intent commençant un nouveau Activity été émis de la manière suivante.

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

C'est similaire à ce que je fais. Veuillez noter que la création de Activity en appelant new Activity() produira des avertissements d'impression Robolectric sur la création d'une activité incorrecte, cela peut probablement être mieux fait...

20voto

James Neville Points 181

Mettre à jour ceci pour 3.1.2 car les réponses ci-dessus n'ont pas fonctionné pour moi : -

     loginButton.callOnClick();

    Intent startedIntent = shadowOf(activity).getNextStartedActivity();
    ShadowIntent shadowIntent = shadowOf(startedIntent);
    assertEquals(NextActivity.class, shadowIntent.getIntentClass()); 

18voto

Scott Bale Points 4385

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

7voto

Ari Lacenski Points 251

Inspiré par la réponse de @MichK, voici un test de fonctionnement complet utilisant la 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)));
}

2voto

OzzyTheGiant Points 309

La réponse de James Neville fonctionne sur 4.3. Cependant, j'ai utilisé l'API AndroidX, Espresso et Kotlin :

 // scenario initialization is done in @Before setUp method, I did it here for brevity
val scenario = ActivityScenario.launch(MainActivity::class.java)

@Test fun test() {
    onView(withId(R.id.button_id)).perform(click())

    scenario.onActivity { activity ->
        val intent = shadowOf(activity).nextStartedActivity
        val shadowIntent = shadowOf(intent)

        assertEquals(SearchResultsActivity::class.java, shadowIntent.intentClass)
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X