2009-12-29 11 views

risposta

27

Sì.

Se si sviluppa utilizzando il plug-in Eclipse ADT, aprire la prospettiva DDMS dopo aver avviato l'emulatore e cercare la vista Controllo emulatore. Esiste una sezione di controlli di posizione che consente di inviare coordinate di latitudine e longitudine fisse o file GPX (GPS Exchange Format) o KML (Keyhole Markup Language) se si desidera inviare più coordinate a intervalli regolari (per simulare il viaggio su un percorso specifico) .

In alternativa, si può semplicemente telnet l'emulatore e utilizzare il comando geo dalla riga di comando, che supporta latitudine fisso e longitudine nonché frasi di dati NMEA:

telnet localhost 5554 
geo fix -82.411629 28.054553 
geo nmea $GPGGA,001431.092,0118.2653,N,10351.1359,E,0,00,,-19.6,M,4.1,M,,0000*5B 
+3

Che ne dici di test su un dispositivo reale: come puoi impostare il tuo GEO su adb? – fijiaaron

+0

Grazie mille. Ho fatto molte indagini e ora ho la risposta! – eav

+0

Ciao. Ho avuto lo stesso problema, volevo testare su un dispositivo reale usando il comando "geo fix", risulta che non è possibile fuori dalla scatola quindi ho scritto un'app che fornisce quella funzionalità :) [MockGeoFix] (https: // riproduci .google.com/store/apps/details? id = github.luv.mockgeofix & hl = it) e [codice sorgente] (https://github.com/luv/mockgeofix/) – luv

3

Forse l'applicazione di prova this o this può aiutarti.

15

forse si vuole ad un uso un test di unità, in modo da poter provare questo:

public class GPSPollingServiceTest extends AndroidTestCase { 
    private LocationManager locationManager; 

    public void testGPS() { 
     LocationManager locationManager = (LocationManager) this.getContext().getSystemService(Context.LOCATION_SERVICE); 
     locationManager.addTestProvider("Test", false, false, false, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE); 
     locationManager.setTestProviderEnabled("Test", true); 

     // Set up your test 

     Location location = new Location("Test"); 
     location.setLatitude(10.0); 
     location.setLongitude(20.0); 
     locationManager.setTestProviderLocation("Test", location); 

     // Check if your listener reacted the right way 

     locationManager.removeTestProvider("Test"); 
    } 
} 


per far funzionare tutto questo è necessario anche un permesso richiesto al AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 
+0

Ciao, puoi spiegarci un po 'di più dettagliato come funziona questo codice. In che modo l'attività che risponde agli eventi di localizzazione verrà effettivamente testata con questo? – Petar

+1

Ciao, è passato un po 'di tempo, ma vediamo se riesco a rimettere tutto insieme: Con il LocationManager si ottiene il sistema GPS location manager che notifica la tua app sui cambiamenti di posizione. Nella seconda riga aggiungi un nuovo fornitore di posizione. Poiché eseguirai un test unitario, non avrai nessun altro fornitore di posizione registrato. Dove ho contrassegnato il commento "// Imposta il test", è possibile inizializzare i componenti che si desidera testare, che dovrebbero essere in ascolto delle modifiche alle posizioni da LocationManager. – Mallox

+0

Dopo aver inviato una nuova posizione al gestore località e il codice che si desidera testare dovrebbe fare qualcosa con quella informazione, in modo da poter controllare in seguito se ha fatto la cosa giusta. Infine, si desidera rimuovere il provider di test, in modo che non ci siano diversi provider di posizione per i test, se si scrivono altri test. (anche se junit probabilmente lo ripulirà correttamente) – Mallox

0

Suggerisco di scrivere un test che invia l'oggetto posizione alla classe listener che si desidera testare. Con questo in mente avrete bisogno di alcuni metodi di supporto che saranno in grado di produrre oggetti di posizione.

Es .:

Per prima cosa è inviare una posizione con coordinate fisse (per esempio centro di New York).

// test se tutto è OK

Che si invia una coordinata che è appart 100 metri dalla prima coordinata. È possibile farlo con la funzione ho implementato di recente: https://stackoverflow.com/a/17545955/322791

// test se tutto è OK

E 'comune che i metodi GPS sono legati al tempo. Ti suggerisco di implementare il metodo getNow() sulla classe del listener e chiamarlo ogni volta che ti serve l'ora corrente.

long getNow() { 
    if (isUnitTesting) { 
     return unitTestTime; 
    } else { 
     System.getcurrenttimemillis(); 
    } 
} 

In un ambiente di test di unità è sufficiente impostare l'obj.isUnitTesting = true e obj.unitTestTime per ogni volta che vuoi. Dopodiché puoi inviare la prima posizione al listener, quindi modificare il tempo (+ x secondi) e inviare un'altra posizione ...

Sarà molto più facile testare la tua applicazione in questo modo.

2

in aggiunta a codice Mallox questo è il sulotion per la posizione finto oltre a vera e propria posizione GPS: TEST_MOCK_GPS_LOCATION è una stringa

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    Location location = null; 

    List providers = lm.getAllProviders(); 
    for (Object provider : providers) { 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      return; 
     } 
     Location loc = lm.getLastKnownLocation((String) provider); 
     if (provider.equals(TEST_MOCK_GPS_LOCATION)) { 
      mLastLocation = loc; 
     } 
    } 

nella classe di test che è:

public class GPSPollingServiceTest extends AndroidTestCase { 
private LocationManager locationManager; 

public void testGPS() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { 
    LocationManager locationManager = (LocationManager) this.getContext().getSystemService(Context.LOCATION_SERVICE); 
    List providers = locationManager.getAllProviders(); 
    if(!providers.contains(TEST_MOCK_GPS_LOCATION)) { 
     locationManager.addTestProvider(TEST_MOCK_GPS_LOCATION, false, false, false, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE); 
     locationManager.setTestProviderEnabled(TEST_MOCK_GPS_LOCATION, true); 
     // Set up your test 
     Location location = new Location(TEST_MOCK_GPS_LOCATION); 
     location.setLatitude(34.1233400); 
     location.setLongitude(15.6777880); 
     location.setAccuracy(7); 
     location.setTime(8); 
     location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); 

     locationManager.setTestProviderLocation(TEST_MOCK_GPS_LOCATION, location); 

     Method locationJellyBeanFixMethod = Location.class.getMethod("makeComplete"); 
     if (locationJellyBeanFixMethod != null) { 
      locationJellyBeanFixMethod.invoke(location); 
     } 
    } else { 
     // Check if your listener reacted the right way 
     locationManager.removeTestProvider(TEST_MOCK_GPS_LOCATION); 
    } 
} 

}

spero che ti possa aiutare

0

Nei controlli estesi del tuo emulatore (fai clic su "..." sulla barra di controllo accanto al tuo emulatore) c'è la scheda Posizione, dove puoi inserire manualmente singole posizioni (latitudine/longitudine/altitudine) e inviarle al dispositivo virtuale o configurazione della riproduzione di dati GPS alla velocità desiderata da un GPX o da un file KML che è possibile importare.

Modifica: è l'emulatore Android predefinito di cui sto parlando.

Problemi correlati