对于UI测试,我尝试设置模拟位置。我的应用程序是位置感知。我试图在应用程序中测试该逻辑。
第一个位置设置正确。但是,第二个位置通常不准确。大多数情况下,第二个位置最终是第一个和第二个位置之间的中间点。当我重复设置第二个位置时,实际的设备GPS位置移动得更近,但仍然没有移动到实际的第二个位置。
以下是日志的摘录:
First call to set mock location works perfectly:
setMockLocation: Set location to: latitude: 34.001 longitude: -118.485
onLocationResult: Got new location
checkIfBuildingDiscovered: Called with latitude: 34.001 longitude: -118.485
设置模拟位置的第二次调用缩短了一半距离:
moveNorth: Attempted distance: 300
moveNorth: Actual distance: 298.92993
moveNorth: new location: latitude: 34.00369494585236 longitude: -118.485
setMockLocation: Set location to: latitude: 34.00369494585236 longitude: -118.485
Got new location
getMinDistanceFromCurrentBuildings: Current location: latitude: 34.0023474 longitude: -118.485
getMinDistanceFromCurrentBuildings: Distance from previous location: 149.45686
以下是我设置模拟位置的方法:
Location location = new Location(LocationManager.GPS_PROVIDER);
location.setLatitude(latitude);
location.setLongitude(longitude);
// Set other parameters to make the location complete.
locationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, location);
Log.i(LOG_TAG, "setMockLocation: Set location to: latitude: " + latitude
+ " longitude: " + longitude);
以下是模拟位置服务的启用方式:
locationManager.addTestProvider(
LocationManager.GPS_PROVIDER,
false,
false,
false,
false,
true,
true,
true,
Criteria.POWER_LOW,
Criteria.ACCURACY_FINE);
locationManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true);
locationManager.setTestProviderStatus(
LocationManager.GPS_PROVIDER,
LocationProvider.AVAILABLE,
null,
System.currentTimeMillis());
我最好的猜测是Android设备在某种程度上不喜欢太大的位置跳跃。它可能会假定读数错误。因此,它可能会尝试使用之前的GPS读数对其进行平均,以限制可能的错误读数。
我的Android测试如何将位置设置为特定的模拟位置并确保它是实际位置?
PS:当我尝试在Android模拟器中手动设置位置时,我注意到类似的行为。我将输入一个新的GPS位置并点击发送。地图活动将更新我的GPS坐标方向的位置。每次我点击发送,它都会靠近它。其他时候,我输入新的GPS坐标,点击发送,地图活动将直接更新。