2012-06-09 8 views
45

Mam małą aplikację, która współdziała ze zdalną usługą android. Chciałbym wyśmiewać tę usługę w testach jednostkowych. Używam Robolectric i JUnit dla innych przypadków testowych i cieni, ale nie mogłem sobie wyobrazić, jak radzić sobie z usługami zdalnymi.Jak przetestować zdalny serwis pomocy Android

Czy wystarczy utworzyć i uruchomić usługę testową przy użyciu tego samego pakietu z prawdziwymi usługami i metodami eksportu przy użyciu tego samego aidl?

Ponieważ nie mam kodu do tej usługi, zakładam, że nie mogę użyć Robolectric 's ShadowService, która wymaga obecności rzeczywistej klasy.

Wielkie dzięki.

+0

Myślę, że twoje linki są zepsute. – PunDefeated

+0

Czy testujesz usługę zdalną lub małą aplikację, która wchodzi w interakcję ze zdalną usługą Android? Jeśli testujesz aplikację, zacznę od kodowania do interfejsu. Wszystkie połączenia do usługi zdalnej powinny być wykonywane za pomocą interfejsu. Twoja mała aplikacja będzie miała implementację interfejsu, który faktycznie wywołuje zdalną usługę. Twój pakiet testowy będzie miał drugą implementację, która kpi z informacji zwróconych przez zdalną usługę. Każdy test może skonfigurować niektóre zabezpieczenia w danych pamięci używanych przez implementację pakietów testowych. –

+0

Nie zrobiłem czegoś takiego w Androidzie, ale mam ze sprężyną w innych aplikacjach java, więc nie jestem pewien dokładnego rozwiązania. –

Odpowiedz

1

Chciałbym użyć Mockito, aby utworzyć makietę interfejsu, a następnie przekazać tę instancję do kodu w testach. Możesz również ręcznie utworzyć implementację tego interfejsu w kodzie testowym i użyć go.

Musisz więc zrobić sobie kpiny i ważne jest, aby kod, który chcesz przetestować, używał zastrzyku zależności, aby uzyskać odniesienie do interfejsu pomocy, abyś mógł w swoich testach zdać własną próbę.

0

Jeśli chcesz napisać test jednostkowy dla usługi, możesz użyć Mockito do kpienia z zachowania usługi. Jeśli chcesz przetestować usługę na prawdziwym urządzeniu, to w ten sposób możesz połączyć się z usługą.

@RunWith(AndroidJUnit4.class) 
public classRemoteProductServiceTest { 
    @Rule 
    public final ServiceTestRule mServiceRule = new ServiceTestRule(); 
    @Test 
    public void testWithStartedService() throws TimeoutException { 
     mServiceRule.startService(
       new Intent(InstrumentationRegistry.getTargetContext(), ProductService.class)); 
     //do something 
    } 
    @Test 
    public void testWithBoundService() throws TimeoutException, RemoteException { 
     IBinder binder = mServiceRule.bindService(
       new Intent(InstrumentationRegistry.getTargetContext(), ProductService.class)); 
     IRemoteProductService iRemoteProductService = IRemoteProductService.Stub.asInterface(binder); 
     assertNotNull(iRemoteProductService); 
     iRemoteProductService.addProduct("tanvi", 12, 12.2f); 
    assertEquals(iRemoteProductService.getProduct("tanvi").getQuantity(), 12); 
    } 
} 
Powiązane problemy