Durch das Testen dieser Schaltfläche wird eine Aktivität mit Robolectric gestartet

Lesezeit: 4 Minuten

Benutzer-Avatar
Benutzer739684

Hallo, ich habe folgenden Code:

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

Aber ich habe keine Ahnung, wie ich testen kann, ob durch Drücken von pressMeButton eine neue Aktivität gestartet wurde. Eigentlich tut es das, aber wie schreibt man den richtigen Robolectric Unit Test für diese Tatsache?

In Robolectric 2.1.1 können Sie überprüfen, ob Intent neu anfangen Activity wurde auf folgende Weise emittiert.

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

Das ist ähnlich wie das, was ich tue. Bitte beachten Sie, dass erstellen Activity durch Anruf new Activity() wird Robolectric Warnungen über das unsachgemäße Erstellen von Aktivitäten ausgeben, dies kann wahrscheinlich besser gemacht werden …

  • assertThat(intent.getComponent()).isEqualTo(new ComponentName(activity, MySecondActivity.class)); Funktioniert bei mir nicht. Sein Sprichwort kann den Komponententyp in der Methode assertThat () nicht übergeben

    – Abhijit-Chakra

    9. Oktober 2014 um 6:26 Uhr

  • @AbhijitChakra überprüfen Sie Ihre Assertions-Importe. Diese Beispiele verwenden Fest, versuchen Sie Folgendes zu verwenden: org.fest.assertions.api.Assertions.assertThat(intent…)

    – Patrick

    2. Februar 2015 um 13:21 Uhr

  • Absicht Absicht = shadowActivity.peekNextStartedActivityForResult().intent; gibt NULL zurück

    – Narren

    1. September 2015 um 14:54 Uhr

  • für Shadowing: benutze Shadows.shadowOf(), es hat sich in Robolectric 3.0 geändert. Weitere Informationen zu anderen Änderungen finden Sie in diesem Handbuch

    – Narren

    1. September 2015 um 15:16 Uhr

  • Die Upgrade-Anleitung ist github.com/robolectric/robolectric/wiki/…

    – karl

    23. Februar 2016 um 19:15 Uhr

Benutzer-Avatar
James Neville

Aktualisieren Sie dies für 3.1.2, da die obigen Antworten bei mir nicht funktionierten: –

    loginButton.callOnClick();

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

  • Wow, das sind eine Menge Änderungen im Laufe der Zeit. Dieser hat funktioniert, also ein dickes Lob.

    – Coray Than

    25. Januar 2017 um 23:39 Uhr

  • Irgendeine Idee, wie man das aus einem Fragment macht? Insbesondere wenn Sie ein Fragment via testen startFragment – stackoverflow.com/a/21294337/5111113

    – Huw Davies

    17. Juli 2018 um 7:59 Uhr

Benutzer-Avatar
Scott Bale

Verwenden Sie die von Robolectric 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));
    }  
}

  • assertThat verursacht Fehler: Die Methode assertThat(T, Matcher) im Typ Assert ist für die Argumente (MainActivity, Intent) nicht anwendbar

    – Benutzer739684

    28. Mai 2011 um 11:41 Uhr

  • Entschuldigung, du hast Recht. Ich habe die Antwort korrigiert. Muss eine Absicht annehmen, keine Aktivität. Wir verwenden intern eine Hilfsmethode, die lautet: „assertThat(activity, started(NextActivity.class));“ – viel besser lesbar.

    – Scott Bale

    30. Mai 2011 um 4:27 Uhr

  • Dachte, das funktionierte anfangs und wurde positiv bewertet, aber das tut es nicht. Wo fängt dieser Test die in performClick ausgelöste Absicht ab? Dieser Test konstruiert lediglich zwei Intents und prüft, ob sie gleich sind – was sie niemals sein werden. Könnten Sie diesen Code erläutern?

    – JDT

    13. Juni 2011 um 21:57 Uhr


  • @JDT du hast recht, ich habe die letzte Zeile meiner Antwort korrigiert. Vielen Dank.

    – Scott Bale

    20. Juli 2011 um 20:00 Uhr


  • StartedMatcher wurde entfernt, als robolectric auf 2.0 umgestellt wurde. Nicht sicher, was, wenn überhaupt, es ersetzt hat.

    – gdw2

    7. Oktober 2013 um 19:49 Uhr

Inspiriert von der Antwort von @MichK ist hier ein vollständiger Lauftest mit der buildActivity Methodenkette ab 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)));
}

Die Antwort von James Neville funktioniert am 4.3. Ich habe jedoch die AndroidX-API, Espresso und Kotlin verwendet:

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

Benutzer-Avatar
jiahao

So sieht es beim Robolectric 3 aus

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

Benutzer-Avatar
Gueorgui Obregon

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

}

1051950cookie-checkDurch das Testen dieser Schaltfläche wird eine Aktivität mit Robolectric gestartet

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy