Durch das Testen dieser Schaltfläche wird eine Aktivität mit Robolectric gestartet
Lesezeit: 4 Minuten
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
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
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+:
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)
}
}
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));