【问题标题】:Unit Testing Location Service单元测试定位服务
【发布时间】:2011-08-22 15:01:38
【问题描述】:

我正在尝试对位置跟踪服务进行单元测试。我正在尝试使用 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());
    }
};

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

有没有人成功使用这些方法对位置服务进行单元测试?

【问题讨论】:

  • 我还要提一下,我确实拥有测试项目和实际项目的 ACCESS_MOCK_LOCATIONS 权限。
  • 你解决了吗?我有同样的问题吗?

标签: android unit-testing geolocation


【解决方案1】:

在进行以下修改后,我能够让 @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);
        }
    }
}

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

【讨论】:

  • 它确实为我识别
【解决方案2】:

嗨,在我的第一个基于 GPS 的项目中,我遇到了同样的问题,所以我编写了一个 java 代码,它将 GPS Fix 发送到我的 android 模拟器下面是 sn-p。

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);
    }

    }
}

【讨论】:

  • 感谢代码!您是否能够成功地将其连接到 Android 的 JUnit 测试中?看来我必须同时在一个单独的进程中运行它,这对我来说不是一个理想的解决方案。
  • 是的,这只会将模拟 GPS 发送到在端口 5554 的模拟器上运行的基于 GPS 的普通应用程序
  • 对不起,这是否意味着您已将其连接到 JUnit 以进行自动化测试?如果是这样,您能否更好地解释一下它是如何与您的测试用例挂钩的?
  • 为什么要向模拟器发送字符串?模拟器需要字符串吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
  • 2011-02-03
  • 2019-05-06
  • 1970-01-01
相关资源
最近更新 更多