2012-06-09 21 views
45

Ho una piccola app che interagisce con un servizio remoto android. Mi piacerebbe prendere in giro quel servizio nei test unitari. Io uso Robolectric e JUnit per altri casi di test e ombre ma non riesco a capire come gestire i servizi remoti.Come testare il servizio di assistenza remota per android

È sufficiente creare e avviare un servizio di test utilizzando lo stesso pacchetto con il servizio reale e i metodi di esportazione utilizzando lo stesso aidl?

Poiché non ho il codice per quel servizio, presumo che non sia possibile utilizzare ShadowService che richiede che la classe effettiva sia presente.

Grazie mille.

+0

Penso che i collegamenti siano interrotti. – PunDefeated

+0

Stai testando il servizio remoto o la piccola app che sta interagendo con il servizio Android remoto? Se stai testando l'app, inizierei codificando su un'interfaccia. Tutte le chiamate al servizio remoto dovrebbero essere fatte con l'interfaccia. La tua piccola applicazione avrebbe un'implementazione dell'interfaccia che effettivamente chiama il servizio remoto. Il tuo pacchetto di test avrebbe una seconda implementazione che deride le informazioni restituite dal servizio remoto. Ogni test può configurare un backup dei dati di memoria utilizzati dall'implementazione dei pacchetti di test. –

+0

Non ho mai fatto qualcosa di simile in Android, ma ho avuto a che fare con altre applicazioni Java, quindi non sono sicuro di una soluzione esatta. –

risposta

1

Vorrei utilizzare Mockito per creare un Mock dell'interfaccia e quindi passare quell'istanza al codice nei test. È anche possibile creare manualmente un'implementazione di tale interfaccia nel codice di test e utilizzarla.

Quindi si deve fare la beffa da soli ed è importante che il codice che si desidera testare usi una qualche forma di dipendenza per acquisire un riferimento all'interfaccia helpl, in modo da poter passare il proprio finto nei test.

0

Se si desidera scrivere un test di unità per il servizio, è possibile utilizzare Mockito per il comportamento del servizio di derisione. Se si desidera testare il proprio servizio sul dispositivo reale, è possibile connettersi al servizio.

@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); 
    } 
} 
Problemi correlati