Unit Testing Location Service

烈酒焚心 提交于 2019-12-31 22:28:12

问题


I've got a location tracking service that I'm trying to unit test. I'm trying to use the locationManager.addTestProvider and setTestProviderLocation methods to achieve this. I can't seem to get any of the locations to pass through the provider and hit my LocationListener, however. Here is my code:

public void testGettingLocations() {
    mLocationManager = (LocationManager)mContext.getSystemService(Context.LOCATION_SERVICE);

    if (mLocationManager.getProvider(TEST_PROVIDER) != null) {
        mLocationManager.removeTestProvider(TEST_PROVIDER);
    }

    mLocationManager.addTestProvider(TEST_PROVIDER, false, false, false, false, false, false, false, Criteria.POWER_LOW, Criteria.ACCURACY_FINE);
    mLocationManager.setTestProviderEnabled(TEST_PROVIDER, true);
    mLocationManager.setTestProviderStatus(TEST_PROVIDER, LocationProvider.AVAILABLE, null, System.currentTimeMillis());


    locations = new ArrayList<Location>();


    mLocationManager.requestLocationUpdates(TEST_PROVIDER, 0, 0, ll);


    for (int i = 0; i<130; i++) {
        Location loc = new Location(TEST_PROVIDER);
        loc.setLatitude(0 + i);
        loc.setLongitude(130 - i);
        loc.setTime(System.currentTimeMillis());
        loc.setSpeed(0);
        loc.setAccuracy(25);
        loc.setAltitude(0);
        loc.setBearing(0);
        mLocationManager.setTestProviderLocation(TEST_PROVIDER, loc);       
    }

    assertEquals(130, locations.size());
}

LocationListener ll = new LocationListener() {

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {   }
    @Override
    public void onProviderEnabled(String provider) {}
    @Override
    public void onProviderDisabled(String provider) {}
    @Override
    public void onLocationChanged(Location location) {
        locations.add(location);
        Log.d("TEST", "lat: " + location.getLatitude() + ", lon: " + location.getLongitude());
    }
};

The assert fails because locations.size() returns 0, and the log statement in my locationlistener never gets printed.

Has anyone had any success using these methods to unit test Location services?


回答1:


I was able to get @ingsaurabh's example working in a unit test after making the following modifications:

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import java.net.UnknownHostException;

public final class TestLocationProvider {
    static void sendLocation(double latitude, double longitude) {
        try {
            Socket socket = new Socket("10.0.2.2", 5554); // usually 5554
            socket.setKeepAlive(true);
            String str = "geo fix " + longitude + " " + latitude ;
            Writer w = new OutputStreamWriter(socket.getOutputStream());
            w.write(str + "\r\n");
            w.flush();
        }
        catch (UnknownHostException e) {
            throw new RuntimeException(e);
        }
        catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

The important detail is the IP address. The emulator does not recognize 'localhost' as a valid hostname.




回答2:


Hi in my first GPS based project I faced the same problem so I write a java code that will send GPS Fix to my android emulator below is the snippet.

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Main {

static final int PAUSE = 4000; // ms
static final float START_LONGITUDE = 51, START_LATITUDE = -1.3f;
static final int NO_SAMPLE = 100;
static final float DELTA_LONGITUDE = 0.000005f, DELTA_LADITUDE = 0.000005f;

public static void main(String[] args) {
    try {
        Socket socket = new Socket("localhost", 5554); // usually 5554

        PrintStream out = new PrintStream(socket.getOutputStream());
        float longitude = START_LONGITUDE, latitude = START_LATITUDE;
        String str;

        for (int i = 0; i < NO_SAMPLE; i++) {
            str = "geo fix " + latitude + " " + longitude + "\n";
            out.print(str);
            System.out.print(str);

            Thread.sleep(PAUSE);

            longitude += DELTA_LONGITUDE;
            latitude += DELTA_LADITUDE;
        }
    } catch (UnknownHostException e) {
        System.exit(-1);
    } catch (IOException e) {
        System.exit(-1);
    } catch (InterruptedException e) {
        System.exit(-1);
    }

    }
}


来源:https://stackoverflow.com/questions/7149432/unit-testing-location-service

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!