2015-04-23 15 views
5

Czy mogę użyć Robolectric do przetestowania, że ​​działanie rozpoczyna usługę z określonym pakietem przekazanym wraz z intencją? Odpowiedź: Tak!Użyj Robolectric, aby przetestować uruchomienie usługi z dodatkami intencji?

Chcę napisać Robolectric testu opartego na który sprawdza, że ​​moi MainActivity rozpoczyna MyService z określonej liczby przyjętej w intencyjny dodatkami:

w „MainActivity.java” Mam metodę

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

i to jest moja sprawa test "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 
    } 
} 

Więc moje pytanie brzmi: Czy mogę użyć Robolectric do tego celu?

myślę zdobione ten, patrz odpowiedź poniżej ...

Przypadek testowy nie działa, ponieważ raporty „nie ma żadnych intencji dodatkami!”. Korzystając z debuggera zauważyłem, że metoda Intent.putExtras() nie ma wpływu na środowisko Robolectric. Właściwość i.mExtras (Intent.mExtras) jest poprawnie ustawiona na odwołanie do pakietu po uruchomieniu aplikacji na moim urządzeniu. Po uruchomieniu testu jest to null. Przypuszczam, że to sugeruje, że odpowiedź na moje pytanie brzmi "nie", więc czy powinienem zrezygnować z tego przypadku testowego, czy jest jakiś sposób na wykonanie tego testu?

Edit: poprawiono metodę przykład startMyActivity() do zastanowienia się, co tak naprawdę miał problem z: (?) Wydaje się, że nieruchomość Intent.mExtras nie zostanie wypełniona, chyba że istnieją pewne treści w Bundle. Różni się to od środowiska Android Live, które analizowałem za pomocą debuggera.

Odpowiedz

1

Nie byłem całkowicie dokładny w tym, jak przedstawiłem swój przykładowy kod! Zaktualizowałem przykład, aby pokazać kod, z którym miałem problem.

Okazało się, że istnieje różnica w sposobie zarządzania w środowisku Robolectric w porównaniu do rzeczywistego środowiska Android. Z Robolectric Intent.mExtras nie zostanie wypełniony przez Intent.putExtras(), chyba że faktycznie jest dodana do Bundle dodana do Intent jako dodatki.

+1

Interesujące. Domyślnie Robolectric korzysta z API16 AOSP. Czym jest debugowanie wersji Androida? Czy możesz dodać "@Config {emulateSdk = } do testu? Zastanawiam się tylko, czy jest to specyficzne dla wersji Android lub Robolectric –

+0

Hi Eugen, dziękuję za tę podpowiedź. Używam 'targetSdkVersion 19' dla aplikacji. Próbowałem 'emulateSdk = {16,18,21}' dla testu, ale wynik jest zawsze taki sam: Jeśli zrobię 'Intent.putExtras()' ze świeżym 'Bundle', do którego nie dodałem żadnych danych, wtedy 'Intent.mExtras' pozostaje' null' w środowisku Robolectric. Co oznacza skrót "AOSP"? – jokki

+0

... dodaj '19' do zestawu (Robolectric) emulowanych SDK. – jokki