在将此标记为重复之前,请注意,这不是关于授予正在测试的应用程序的权限,而是测试apk本身。
在我的应用中,有一些功能可以从Download
目录(/sdcard/download
)获取文件,对其进行验证并将其复制到应用的私人商店(/data/data/com.package.myapp/files/
),以便文件在需要时可用。
要测试此功能,我需要在Download
目录中放置一些测试文件:一些已知有效,另一些已知无效文件。我已将这些文件放在assets
组中的androidTest
目录中。
在我的测试课程中,我有一个@BeforeClass public static void prepareAssets()
方法,他的工作是从assets
目录中获取这些文件,并在导入之前将它们复制到Download
文件夹中。验证测试实际运行。
此准备步骤失败:
04-12 00:25:19.282 11231-11246/? E/TEST: Failed to prepare test assets
java.io.FileNotFoundException: /storage/emulated/0/Download/test1.jpg (Permission denied)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
at java.io.FileOutputStream.<init>(FileOutputStream.java:169)
at ca.mahram.android.testextstorexfer.CopyUtil.copy(CopyUtil.java:20)
at ca.mahram.android.testextstorexfer.ExampleInstrumentedTest.prepareAssets(ExampleInstrumentedTest.java:54)
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.RunBefores.evaluate(RunBefores.java:24)
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 android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:58)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:375)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1939)
现在我的应用只需要android.permission.READ_EXTERNAL_STORAGE
权限即可复制这些文件,这就是我在清单中的内容。
但是,测试需要android.permission.WRITE_EXTERNAL_STORAGE
权限,我已将其置于androidTest/AndroidManifest.xml
。
我已经尝试过每次尝试授予android.permission.WRITE_EXTERNAL_STORAGE
测试无效的技巧。
我(尝试失败)尝试过:
adb shell pm grant ca.mahram.android.testextstorexfer android.permission.WRITE_EXTERNAL_STORAGE
- &gt;操作不允许:java.lang.SecurityException:包ca.mahram.android.testextstorexfer没有请求权限android.permission.WRITE_EXTERNAL_STORAGE adb shell pm grant ca.mahram.android.testextstorexfer.test android.permission.WRITE_EXTERNAL_STORAGE
- &gt;失败FileNotFoundException
(许可被拒绝)@Rule public GrantPermissionRule permissionRule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE);
- &gt;失败FileNotFoundException
(许可被拒绝)InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("pm grant " + InstrumentationRegistry.getContext().getPackageName() + " " + Manifest.permission.WRITE_EXTERNAL_STORAGE);
- &gt;失败FileNotFoundException
(许可被拒绝)InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand("pm grant " + InstrumentationRegistry.getTargetContext().getPackageName() + " " + Manifest.permission.WRITE_EXTERNAL_STORAGE);
- &gt;失败FileNotFoundException
(许可被拒绝)我需要的是在测试运行之前在Download
文件夹中提供这些资源。我遇到的每个解决方案都是关于授予应用程序权限,而我没有找到任何关于授予测试apk权限的信息。
我完全没有想法。我如何准备这些资产?有没有更好的方法呢?
以下是Github上的示例代码:https://github.com/copolii/so49791104