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.
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 –
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
... dodaj '19' do zestawu (Robolectric) emulowanych SDK. – jokki