有没有办法在不使用另一个模拟位置提供程序应用程序的情况下模拟 Android 设备上的当前位置进行测试? 我有一个导航应用程序,我需要对其进行一些仪器测试,并且 UI 取决于当前跟踪的位置。当我尝试授予模拟位置的权限访问权限时,它抛出了错误:
Permission: android.permission.ACCESS_MOCK_LOCATION cannot be granted!
这是我的代码。
@LargeTest
@RunWith(AndroidJUnit4ClassRunner::class)
class SpeedTTSWarningTrackingInstrumentedTests
{
// -------------------------------------------------------------------------------------------------
private var lm : LocationManager? = null
companion object
{
private val appContext: Context = getApplicationContext()
private val mainIntent = Intent(appContext, MainActivity::class.java)
private var mActivityIdlingResource: IdlingResource? = null
}
// -------------------------------------------------------------------------------------------------
@Rule(order = 0)
@JvmField
val permissionRule: GrantPermissionRule = GrantPermissionRule.grant(
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION,
"android.permission.ACCESS_MOCK_LOCATION"
)
@Rule(order = 1)
@JvmField
val activityScenarioRule = ActivityScenarioRule<MainActivity>(mainIntent)
// -------------------------------------------------------------------------------------------------
@Before
fun beforeTests(){
activityScenarioRule.scenario.moveToState(Lifecycle.State.RESUMED)
runBlocking { delay(2000) }
activityScenarioRule.scenario.onActivity { activity ->
mActivityIdlingResource = activity.getActivityIdlingResource()
IdlingRegistry.getInstance().register(mActivityIdlingResource)
}
}
@After
fun closeActivity(){
activityScenarioRule.scenario.close()
}
// -------------------------------------------------------------------------------------------------
@Test
fun changeLocation(){
runBlocking { delay(10000) }
mockLocation(45.661936, 25.608026)
runBlocking { delay(10000) }
}
// -------------------------------------------------------------------------------------------------
private fun mockLocation(lat: Double, lon: Double)
{
lm = getSystemService(appContext,LocationManager::class.java)
val mocLocationProvider = LocationManager.FUSED_PROVIDER
lm!!.addTestProvider(
mocLocationProvider, false, false,
false, false, true, true, true, 3, 2
)
lm!!.setTestProviderEnabled(mocLocationProvider, true)
val mockLocation = Location(mocLocationProvider) // a string
mockLocation.latitude = lat // double
mockLocation.longitude = lon
mockLocation.time = System.currentTimeMillis()
mockLocation.accuracy = 1f
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
{
mockLocation.elapsedRealtimeNanos = SystemClock.elapsedRealtimeNanos()
}
lm!!.setTestProviderLocation(mocLocationProvider, mockLocation)
}
}
P.S 我对一般测试很陌生。我正在寻找一些指导。我做错了什么吗?您将如何解决这个问题? 我刚刚发现 android.permission.ACCESS_MOCK_LOCATION 自 API 级别 23 起已被删除。关于我现在可以做什么有什么想法吗?
我尝试使用模拟位置提供程序和 GrantPermissionRule。我还创建了一个特定的调试 AndroidManifest。
这是正确的做法吗?
您必须在设置中为模拟位置定义应用程序: 转到
Settings
并选择 More Settings
选项卡。单击 About Phone
,然后按 Software Version
选项卡几次,除非您收到有关已启用开发人员选项的弹出窗口。现在打开 Developer Options
选项卡并找到 Select Mock Location App
。打开选项卡并选择模拟位置的应用程序。