2015-04-23 13 views
5

Kann ich Robolectric verwenden, um zu testen, dass eine Aktivität einen Dienst mit einem bestimmten Paket startet, das mit der Absicht übergeben wurde? Antwort: Ja!Verwenden Sie Robolectric, um den Start eines Dienstes mit Extras zu testen?

Ich mag einen Robolectric-basierten Test schreiben, dass in der Absicht Extras bestand meine MainActivity beginnt MyService mit einer bestimmten Anzahl Tests:

in "MainActivity.java" Ich habe die Methode

public void startMyService() { 
    Intent i = new Intent(this, MyService.class); 
    Bundle intentExtras = new Bundle(); 
    // TODO: Put magic number in the bundle 
    i.putExtras(intentExtras); 
    startService(i); 
} 

und dies ist mein Testfall "MainActivityTest.java":

import ... 

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class) 
public class MainActivityTest extends TestCase { 
    @Override 
    protected void setUp() throws Exception { 
    super.setUp(); 
    } 

    @Override 
    protected void tearDown() throws Exception { 
    super.tearDown(); 
    } 

    @Test 
    public void testShallPassMagicNumberToMyService() { 
    MainActivity activityUnderTest = Robolectric.setupActivity(MainActivity.class); 
    activityUnderTest.startMyService(); 

    Intent receivedIntent = shadowOf(activityUnderTest).getNextStartedService(); 

    assertNotNull("No intents received by test case!", receivedIntent); 

    Bundle intentExtras = receivedIntent.getExtras(); 
    assertNotNull("No intent extras!", intentExtras); 

    long receivedMagicNumber = intentExtras. 
      getLong(MyService.INTENT_ARGUMENT_MAGIC_NUMBER); 

    assertFalse("Magic number is not included with the intent extras!", 
      (receivedMagicNumber == 0L)); // Zero is default if no 'long' was put in the extras 
    } 
} 

Also, meine Frage ist: Kann ich Robolectric für diesen Zweck verwenden?

Ich glaube, ich dachte das, siehe unten beantworten ...

Der Testfall nicht funktioniert, weil es berichtet „Keine Absicht Extras!“. Mit dem Debugger habe ich festgestellt, dass Intent.putExtras() in der Robolectric-Umgebung keine Wirkung hat. Die i.mExtras (Intent.mExtras) -Eigenschaft ist ordnungsgemäß auf eine Bundle-Referenz festgelegt, wenn ich die App auf meinem Gerät ausführen. Wenn ich den Testfall starte, ist es null. Ich nehme an, dass dies darauf hinweist, dass die Antwort auf meine Frage "Nein" ist. Soll ich also diesen Testfall aufgeben oder gibt es eine Möglichkeit, diesen Test durchzuführen?

Edit: das Beispiel startMyActivity() Verfahren korrigiert zu reflektieren, was ich hatte tatsächlich ein Problem mit: (?) Es scheint, die Intent.mExtras Eigenschaft nicht aufgefüllt ist, es sei denn es einige Inhalte in der Bundle sind. Dies unterscheidet sich von der Android-Live-Umgebung, die ich mit dem Debugger analysiert habe.

Antwort

1

Ich war nicht ganz genau in, wie ich meinen Beispielcode präsentierte! Ich habe das Beispiel aktualisiert, um den Code anzuzeigen, mit dem ich Probleme hatte.

Es stellt sich heraus, dass ein Unterschied darin besteht, wie ein Intent in der Robolectric-Umgebung im Vergleich zur realen Android-Umgebung verwaltet wird. Mit Robolectric Intent.mExtras wird nicht durch Intent.putExtras() besetzt, es sei denn, es gibt tatsächlich einige Inhalte in der Bundle hinzugefügt, um die Intent als Extras.

+1

Interessant. Ich denke standardmäßig verwendet Robolectric API16 AOSP. Was ist die Android-Version, die Sie debuggen? Können Sie '@Config {emulateSdk = } zu Ihrem Test hinzufügen? Ich frage mich nur, ob es spezifisch für Android-Version oder Robolectric –

+0

Hallo Eugen ist, danke für diesen Hinweis. Ich verwende 'targetSdkVersion 19' für die App. Ich habe 'emulateSdk = {16,18,21}' für den Test versucht, aber das Ergebnis ist immer das gleiche: Wenn ich 'Intent.putExtras()' mit einem frischen 'Bundle' mache, dem ich noch keine Daten hinzugefügt habe, dann bleibt "Intent.mExtras" in der Robolectric-Umgebung "null". Wofür steht "AOSP"? – jokki

+0

... fügen Sie '19' zu dem Satz von (Robolectric) emulierten SDKs hinzu. – jokki

Verwandte Themen