Android mock location

1. Mock Location 简介

借助 mock location, 在测试LBS应用时不必进行路测就可以生成位置数据。 总的来说,使用 mock location 有以下好处:

  • 可以生成特定的模拟数据而不必真的移动物理设备
  • 模拟数据同样来自 location service,可以测试到应用中位置相关的代码。另外,是从产品外部发送模拟数据,产品代码中不会编写一些在发布前必须删除或关闭的测试代码
  • 不必移动物理设备所以可以在模拟器上测试产品

Android 官方文档 中给出了详细的操作步骤。但文档中的实现是基于 Google Play services 的。 对于没有安装 Google Play services 的设备,文档中提供的方法是不可行。

2. Mock Location 实现

参考一些技术博客, 发现不基于 Google Play services 也可以很方便地实现 mock location。总结如下

首先要确保打开设备的 mock location 开关 (2.3上 设置 - 应用程序 - 开发 - 允许模拟位置, 4.0上 设置 - 开发 - 允许模拟位置)

在 AndroidManifest.xml 中需要声明以下这个不太常用的权限:

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

此外还需要GPS权限 ACCESS_FINE_LOCATION

核心代码如下:

mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
mLocationManager.addTestProvider(LocationManager.GPS_PROVIDER, false,
		false, false, false, true, true, true, 0, /* magic */5);
mLocationManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER,
		true);

Location loc = Utils.createLocation(35 + i * unit, 117 + i
		* unit, 50.f);
loc.setTime(System.currentTimeMillis());
mLocationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, loc);

Utils类定义如下:

public class Utils {
    private static final String PROVIDER = "gps";
    private static final double LAT = 37.377166;
    private static final double LNG = -122.086966;
    private static final float ACCURACY = 3.0f;
    /*
     * From input arguments, create a single Location with provider set to
     * "flp"
     */
    public static Location createLocation(double lat, double lng, float accuracy) {
        // Create a new Location
        Location newLocation = new Location(PROVIDER);
        newLocation.setLatitude(lat);
        newLocation.setLongitude(lng);
        newLocation.setAccuracy(accuracy);
        return newLocation;
    }
    // Example of creating a new Location from test data
    public static final Location testLocation = createLocation(LAT, LNG, ACCURACY);
}

3. Mock Location 实现

Android 官方文档 中给出的最佳实践如下:

  • 从一个独立的 mock location provider app 中发送模拟数据
  • mock location provider app 是从运行在 started service 中的后台线程发送数据的。所以即使 app 进入后台,仍然可以发送模拟数据,且不用担心阻塞 UI 线程。

参考

android mock location on device

转载于:https://my.oschina.net/apm/blog/224330

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Mock 是一种用于在单元测试中模拟 Android 框架的工具。它允许开发人员模拟 Android 组件的行为,以便更容易地进行单元测试。 要使用 Android Mock,您需要添加以下依赖项到您的项目中的 build.gradle 文件中: ``` testImplementation 'org.mockito:mockito-core:x.x.x' ``` 其中 x.x.x 是最新版本的 Mockito。 接下来,您可以在测试类中使用 Mockito 创建和配置模拟对象。例如,假设您要测试一个依赖于网络请求的类: ```java public class MyNetworkClass { private NetworkService networkService; public MyNetworkClass(NetworkService networkService) { this.networkService = networkService; } public void fetchData() { // 使用 NetworkService 执行网络请求 networkService.makeRequest(); } } ``` 您可以使用 Mockito 创建一个模拟的 NetworkService,并对其进行配置,以便在测试中指定预期行为: ```java import org.mockito.Mockito; public class MyNetworkClassTest { @Test public void testFetchData() { // 创建模拟对象 NetworkService mockNetworkService = Mockito.mock(NetworkService.class); // 配置模拟对象的行为 Mockito.when(mockNetworkService.makeRequest()).thenReturn("Mock response"); // 创建要测试的对象,并将模拟对象注入其中 MyNetworkClass myNetworkClass = new MyNetworkClass(mockNetworkService); // 执行测试代码 myNetworkClass.fetchData(); // 验证模拟对象的方法是否被调用,并检查预期结果 Mockito.verify(mockNetworkService).makeRequest(); } } ``` 在此示例中,我们创建了一个模拟的 NetworkService 对象,并配置了它的 makeRequest() 方法的行为。在测试中,我们创建了要测试的 MyNetworkClass 对象,并将模拟的 NetworkService 对象注入其中。然后,我们执行 fetchData() 方法,并使用 Mockito.verify() 来验证模拟对象的方法是否被调用。 这只是一个简单的示例,Android Mock 还提供了更多功能和灵活性,例如模拟异步任务、回调等。您可以通过查阅 Mockito 的文档以及 Android Mock 的其他相关资源来深入了解和使用 Android Mock

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值