Je travaille sur une bibliothèque de notifications push pour Android ( http://deaconproject.org/ ) qui doit prendre des mesures si la connectivité réseau est interrompue ou modifiée - à savoir, il doit rétablir une connexion au serveur ou suspendre son fonctionnement jusqu'à ce que la connectivité réseau soit disponible. Cela semble fonctionner correctement avec et Android BroadcastReceiver pour "Android.net.ConnectivityManager.CONNECTIVITY_ACTION").
Mon problème réside dans le test de la bibliothèque - je voudrais tester automatiquement la réponse de la bibliothèque à une connexion réseau interrompue, ou à une transition de la 3G au WiFi, dans diverses conditions de configuration. Le problème est que je ne veux pas m'asseoir avec l'émulateur et appuyer sur F8 toute la journée.
Existe-t-il un moyen de manipuler par programme les connexions réseau sur Android à partir d'un test jUnit sans recourir au basculement du mode avion? J'ai déjà essayé d'émettre des commandes vers 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.
Faites un clic droit sur le projet dans le panneau "Explorateur de projets", choisissez "Exécuter en tant que" puis "Exécuter les configurations".
Sur le côté gauche de la fenêtre modale affichée, choisissez "Application Android" et sur le côté droit de la même fenêtre, choisissez l'onglet "Cible".
Au bas de la fenêtre, dans la section "Paramètres de lancement de l'émulateur", vous avez une pléthore d'options concernant la connectivité Internet.
J'espère que cela a aidé.
Igor
J'ai trouvé l'application Android Dev Tools très 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 active et désactive le wifi automatiquement, vous permettant ainsi de tester vos récepteurs de diffusion liés au réseau.
Si vous souhaitez installer l'application Dev Tools sur un véritable appareil de développement, vous pouvez copier l'application depuis votre émulateur puis l'installer sur votre appareil à l'aide d'ADB. Pour copier l'application à partir d'un émulateur en cours d'exécution, exécutez:
adb -e pull /system/app/Development.apk ./Development.apk
Cela copie le fichier .apk dans le répertoire en cours. Installez-le ensuite sur votre appareil connecté avec:
adb -d install Development.apk
Vous pouvez également consulter la vue de contrôle de l'émulateur dans Eclipse. Je n'ai pas beaucoup de chance de le faire pour tuer mes données pour le moment, mais il ressemble à ça devrait.
Malheureusement, il n'existe aucun moyen de désactiver vraiment l'accès réseau à partir d'un test unitaire par programme. J'ai déposé une demande d'amélioration Android pour ce problème.
Une solution simple, mais un peu longue et lourde, consiste également à ajouter une couche d'abstraction sur votre moniteur d'état de connexion wifi.
Ajoutez une entité (NetworkStateManager), il doit s'agir d'un singleton de portée d'application (voir RoboGuice ou Dagger proprement, ou accédez à l'instance unique via votre instance d'application).
Ajoutez des méthodes pour enregistrer, désenregistrer les écouteurs de cette entité, en utilisant le modèle de conception Observable Observer.
Chaque activité devra s'y inscrire pendant onStart, se désinscrire dans onStop.
L'entité elle-même sera modifiée par un BroadCastReceiver.
Cela est entièrement testable, si vous utilisez un framework DI, vous pourrez injecter un stub pilotable dans vos activités et voir comment ils réagissent aux changements d'état du réseau.