2010-06-09 4 views
28

Je travaille sur une bibliothèque Push Notifications pour Android (http://deaconproject.org/) qui doit prendre des mesures si la connectivité réseau est interrompue ou modifiée - à savoir, elle doit redémarrer une connexion serveur ou suspendre son fonctionnement jusqu'à ce que la connectivité réseau soit disponible. Cela semble fonctionner correctement en utilisant Android BroadcastReceiver pour "android.net.ConnectivityManager.CONNECTIVITY_ACTION". Mon problème est dans le test de la bibliothèque - je voudrais tester automatiquement la réponse de la bibliothèque à une connexion réseau brisée, ou une transition de la 3G au WiFi, dans diverses conditions de configuration. Le problème est, je ne veux pas s'asseoir avec l'émulateur et frapper F8 toute la journée.Comment désactiver/activer le réseau, passer au Wifi dans l'émulateur Android?

Existe-t-il un moyen de manipuler par programmation des connexions réseau sur Android à partir d'un test jUnit sans recourir au mode Avion basculant? J'ai déjà essayé d'envoyer des commandes à l'émulateur via la console, en manipulant le mode GSM, etc., mais pendant que l'état du téléphone change à l'écran, la connexion Internet reste active.

+1

Avez-vous déjà réussi à trouver une solution à ce problème? – pehrs

+0

Aimeriez-vous connaître une réponse, aussi. Des idées? –

+0

Voir aussi [cette question] (http://stackoverflow.com/questions/8198889/testing-in-airplane-mode-in-android-emulator). –

Répondre

7

Faites un clic droit sur le projet dans le panneau "Explorateur de projet", choisissez "Exécuter en tant que" puis "Exécuter les configurations".

Sur le côté gauche de la fenêtre modalement affichée, choisissez "Application Android" et sur le côté droit de la même fenêtre, choisissez l'onglet "Cible".

En bas de la fenêtre, dans la section "Paramètres de lancement de l'émulateur", vous disposez de nombreuses options concernant la connectivité Internet.

J'espère que cela a aidé.

Igor

+7

Merci pour votre réponse - C'est un pas dans la bonne direction. Les paramètres de lancement de l'émulateur peuvent ajuster la connectivité réseau au moment du démarrage, mais nous recherchons un moyen de le faire par programmation, au moment de l'exécution. La bibliothèque "en test" doit répondre à Android Broadcast Intents (tel que android.net.ConnectivityManager.CONNECTIVITY_ACTION) afin d'ajuster son état à l'état du réseau de l'appareil. Ce dont nous avons besoin, c'est d'un moyen de changer l'état du réseau à partir du test JUnit, afin que nous puissions vérifier que les intentions sont bien reçues et traitées ... – mtbkrdave

4

Vous pouvez regarder la vue de contrôle de l'émulateur éclipse aussi. Je n'ai pas beaucoup de chance de l'obtenir pour tuer mes données pour le moment, mais il semble que ça devrait devrait.

alt text

+0

J'ai essayé cette option, mais via la connexion ADB de la console, mais ne semble pas réellement supprimer la connectivité; malgré la désactivation de la connexion de données GSM, le trafic réseau fonctionne toujours. Ce que je recherche ici est une façon de le faire * par programmation * dans le cadre d'un test automatisé, tel qu'un test JUnit. – mtbkrdave

+0

J'ai eu le même problème (la communication semble continuer). Il semble que vous ayez trouvé un moyen d'écrire ceci via le shell ADB (si vous recommencez à travailler ou si nous tombons sur les commandes de contrôle appropriées). FYI J'ai également été capable de basculer certains paramètres réseau (même problème existe) via telnet à l'emu et les commandes gsm data off et gsm voice off ala http://stackoverflow.com/questions/2577785/ringing-myself- using-android-emulator/2578245 # 2578245 – Chris

+0

Merci pour l'indice, en changeant ces statuts à 'non enregistré 'travaillé pour moi. Aucune idée sur les tests unitaires, cependant. – Walf

6

J'ai trouvé l'application Android Dev Tools vraiment utile.

Il vous permet de manipuler des paramètres système importants comme la connectivité réseau. Il vous permet même de définir un intervalle dans lequel il activera et désactivera le wifi automatiquement, vous permettant ainsi de tester vos récepteurs de diffusion en réseau.

Si vous souhaitez installer l'application Outils Dev sur un véritable dispositif de développement , vous pouvez copier l'application de votre émulateur puis l'installer sur votre appareil à l'aide de la BAD. Pour copier l'application à partir d'un émulateur en cours d'exécution, exécutez:

adb -e pull /system/app/Development.apk ./Development.apk 

Cette copie le fichier .apk dans le répertoire courant. Ensuite, installez ce sur votre appareil connecté avec:

adb -d install Development.apk 

enter image description here

+3

Ceci est utile pour ceux qui souhaitent manipuler l'état du réseau manuellement, mais la question ici cherche un moyen de le faire par programmation (c'est-à-dire à partir d'un test unitaire). Cela peut-il être fait en utilisant une intention envoyée à l'application Dev Tools? – mtbkrdave

4

Malheureusement, il n'y a aucun moyen d'accès au réseau vraiment désactiver à partir d'un programme test unitaire.J'ai déposé un Android enhancement request pour ce problème.

0

Une solution simple, mais un peu longue et lourde, est également d'ajouter une couche d'abstraction sur votre moniteur d'état de connexion wifi.

Ajoutez une Entité (NetworkStateManager), une application doit avoir une portée singleton (voir RoboGuice ou Dagger pour cela, ou accéder à l'instance unique via votre instance d'application).

Ajouter des méthodes pour enregistrer, désenregistrer les écouteurs de cette entité à l'aide du modèle de conception Observable Observer.

Chaque activité devra s'enregistrer lors de onStart, se désinscrire dans onStop.

L'entité elle-même sera modifiée par un BroadCastReceiver. Ceci est entièrement testable, si vous utilisez un cadre DI, vous serez en mesure d'injecter un bouchon pilotable dans vos activités et de voir comment ils réagissent aux changements d'état du réseau.

Questions connexes