单元测试位置服务

dan*_*h32 8 android unit-testing geolocation

我有一个位置跟踪服务,我正在尝试进行单元测试.我正在尝试使用locationManager.addTestProvider和setTestProviderLocation方法来实现这一点.但是,我似乎无法通过提供程序获取任何位置并点击我的LocationListener.这是我的代码:

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());
    }
};
Run Code Online (Sandbox Code Playgroud)

断言失败,因为locations.size()返回0,并且我的locationlistener中的日志语句永远不会被打印.

有没有人使用这些方法成功测试位置服务?

tru*_*kvl 5

在进行以下修改后,我能够将@ ingsaurabh的示例用于单元测试:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

重要的细节是IP地址.模拟器无法将"localhost"识别为有效的主机名.