【问题标题】:Got SecurityException when call getLastKnownLocation in JUnit test在 JUnit 测试中调用 getLastKnownLocation 时出现 SecurityException
【发布时间】:2019-08-13 13:10:52
【问题描述】:

我有从标准LocationManager 获取最后已知位置的简单方法:

fun getLastKnownLocation(context: Context): SimpleLocation {
        val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
        val criteria = Criteria()
        criteria.accuracy = Criteria.ACCURACY_FINE
        val location: android.location.Location?
            location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, true))
        if (location == null) {
            return SimpleLocation.create(0.0, 0.0)
        }
        return SimpleLocation.create(location.latitude, location.longitude)
    }

然后为它编写简单的测试:

class LocationUtilTest {
    private val locationUtil: LocationUtil = spyk()
    private val context = InstrumentationRegistry.getInstrumentation().context


    @Test
    fun getLastKnownLocation() {
         val l = locationUtil.getLastKnownLocation(context)
         assertNotNull(l)
    }
    }

当我运行这个测试时,它会抛出 SecurityException:

注意!

我在stackstace下面用app_package_name替换了我的应用程序包名(我的测试包名是app_package_name.test

java.lang.SecurityException: invalid package name: **app_package_name**.test
at android.os.Parcel.createException(Parcel.java:1950)
at android.os.Parcel.readException(Parcel.java:1918)
at android.os.Parcel.readException(Parcel.java:1868)
at android.location.ILocationManager$Stub$Proxy.getLastLocation(ILocationManager.java:866)
at android.location.LocationManager.getLastKnownLocation(LocationManager.java:1434)
at com.ziuon.trasher.utils.LocationUtil.getLastKnownLocation(LocationUtil.kt:77)
at java.lang.reflect.Method.invoke(Native Method)
at io.mockk.proxy.android.advice.Advice$SuperMethodCall.call(Advice.kt:135)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.handleOriginalCall(JvmMockFactoryHelper.kt:83)
at io.mockk.impl.instantiation.JvmMockFactoryHelper.access$handleOriginalCall(JvmMockFactoryHelper.kt:20)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1$invocation$$inlined$stdFunctions$lambda$1.invoke(JvmMockFactoryHelper.kt:28)
at io.mockk.impl.stub.MockKStub$handleInvocation$originalPlusToString$1.invoke(MockKStub.kt:227)
at io.mockk.impl.stub.SpyKStub.defaultAnswer(SpyKStub.kt:15)
at io.mockk.impl.stub.MockKStub.answer(MockKStub.kt:42)
at io.mockk.impl.recording.states.AnsweringState.call(AnsweringState.kt:16)
at io.mockk.impl.recording.CommonCallRecorder.call(CommonCallRecorder.kt:53)
at io.mockk.impl.stub.MockKStub.handleInvocation(MockKStub.kt:263)
at io.mockk.impl.instantiation.JvmMockFactoryHelper$mockHandler$1.invocation(JvmMockFactoryHelper.kt:25)
at io.mockk.proxy.android.advice.Advice$handle$1.call(Advice.kt:77)
at com.ziuon.trasher.utils.LocationUtil.getLastKnownLocation(Unknown Source:40)
at com.ziuon.trasher.utils.LocationUtilTest.getLastKnownLocation(LocationUtilTest.kt:55)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:392)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2152)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.LocationManagerService.checkPackageName(LocationManagerService.java:2047)
at com.android.server.LocationManagerService.getLastLocation(LocationManagerService.java:2228)
at android.location.ILocationManager$Stub.onTransact(ILocationManager.java:159)
at android.os.Binder.execTransact(Binder.java:731)

所有permissionsuses-feature 都在清单中指明:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-feature android:name="android.hardware.location.gps"
              android:required="false"
/>

是因为我使用InstrumentationRegistry.getInstrumentation().context而抛出吗?或者为什么? 谢谢!

注意

我发现thisthis。这对我没有帮助。

【问题讨论】:

    标签: android kotlin junit


    【解决方案1】:

    您的包名或结构有问题。当 JVM 尝试加载您的类时,它会将其包名识别为无效并抛出 SecurityException。

    参考见https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html

    【讨论】:

    • 感谢您的回复。但是我只有在调用locationManager.getLastKnownLocation 方法时才得到SecurityException。其他LocationManager-s 方法工作正常。
    猜你喜欢
    • 2023-04-09
    • 2015-09-17
    • 1970-01-01
    • 2023-03-06
    • 2022-01-02
    • 2020-11-09
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多