在JUnit测试中调用getLastKnownLocation时得到了SecurityException

时间:2019-08-13 13:10:52

标签: android kotlin junit

我有一种简单的方法可以从标准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。这对我没有帮助。

1 个答案:

答案 0 :(得分:0)

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

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