Comment tester le service android aidl

j'ai une petite application qui interagit avec une distance android service. Je voudrais me moquer de ce service dans les tests unitaires. J'utilise Robolectric et JUnit pour les autres cas de test et les ombres mais je ne pouvais pas comprendre comment traiter avec les services à distance.

est-il suffisant de créer et lancer un service de test utilisant le même paquet avec le service réel et exporter des méthodes utilisant le même aidl?

puisque je n'ai pas le code pour ce service, je suppose que je ne pouvez pas utiliser Robolectric ShadowService ce qui nécessite de classe réelle.

Merci beaucoup.

46
demandé sur Stanley Kou 2012-06-09 16:14:57

2 réponses

je voudrais utiliser Mockito pour créer un Mock de l'interface et ensuite passer cette instance à votre code dans vos tests. Vous pouvez également créer manuellement une implémentation de cette interface dans votre code de test et l'utiliser.

donc vous devez vous moquer vous-même et il est important que le code que vous voulez tester utilise une certaine forme d'injection de dépendance pour obtenir une référence à l'interface aidl, afin que vous puissiez passer votre propre moquerie dans vos tests.

2
répondu Jeroen 2015-12-29 07:57:39

si vous voulez écrire un test unitaire pour le service, alors vous pouvez utiliser Mockito pour se moquer du comportement du service.Si vous voulez tester votre service sur l'appareil réel, alors c'est comment vous pouvez vous connecter avec votre service.

@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);
    }
}
2
répondu user3219477 2018-01-09 10:24:14