如何在androidTest测试中创建测试资产并授予运行时权限?

如何在androidTest测试中创建测试资产并授予运行时权限?,android,android-testing,runtime-permissions,Android,Android Testing,Runtime Permissions,在您将其标记为复制之前,请注意,这并不是授予被测应用程序权限,而是测试apk本身 在我的应用程序中,有一个功能可以从下载目录(/sdcard/Download)获取一个文件,对其进行验证,并将其复制到应用程序的私有存储(/data/data/com.package.myapp/files/)中,以便在需要时可以使用该文件 为了测试这个功能,我需要在下载目录中放置一些测试文件:一些是已知的有效文件,另一些是已知的无效文件。我已将这些文件放在androidTest组的assets目录中 在我的测试类

在您将其标记为复制之前,请注意,这并不是授予被测应用程序权限,而是测试apk本身

在我的应用程序中,有一个功能可以从
下载目录(
/sdcard/Download
)获取一个文件,对其进行验证,并将其复制到应用程序的私有存储(
/data/data/com.package.myapp/files/
)中,以便在需要时可以使用该文件

为了测试这个功能,我需要在
下载
目录中放置一些测试文件:一些是已知的有效文件,另一些是已知的无效文件。我已将这些文件放在
androidTest
组的
assets
目录中

在我的测试类中,我有一个
@BeforeClass public static void prepareAssets()
方法,其任务是在导入和验证测试实际运行之前,从
资产
目录中获取这些文件,并将其复制到
下载
文件夹

此准备步骤失败:

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)
04-12 00:25:19.282 11231-11246/?E/测试:未能准备测试资产
java.io.FileNotFoundException:/storage/emulated/0/Download/test1.jpg(权限被拒绝)
在java.io.FileOutputStream.open(本机方法)
位于java.io.FileOutputStream。(FileOutputStream.java:221)
位于java.io.FileOutputStream。(FileOutputStream.java:169)
在ca.mahram.android.testextstorexfer.CopyUtil.copy(CopyUtil.java:20)上
位于ca.mahram.android.testextstorexfer.ExampleInstrumentedTest.prepareAssets(ExampleInstrumentedTest.java:54)
位于java.lang.reflect.Method.invoke(本机方法)
位于org.junit.runners.model.FrameworkMethod$1.runReflectVeCall(FrameworkMethod.java:50)
位于org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
位于org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java:47)
位于org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
位于org.junit.runners.ParentRunner.run(ParentRunner.java:363)
位于org.junit.runners.Suite.runChild(Suite.java:128)
位于org.junit.runners.Suite.runChild(Suite.java:27)
位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
位于org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
位于org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
访问org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
位于org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
位于org.junit.runners.ParentRunner.run(ParentRunner.java:363)
位于org.junit.runner.JUnitCore.run(JUnitCore.java:137)
位于org.junit.runner.JUnitCore.run(JUnitCore.java:115)
位于android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:58)
位于android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:375)
位于android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1939)
现在我的应用程序只需要android.permission.READ_EXTERNAL_STORAGE
权限就可以复制这些文件,这就是我在清单中的权限

但是,这些测试需要
android.permission.WRITE\u EXTERNAL\u STORAGE
权限,我将其放在
androidTest/AndroidManifest.xml

我已经尝试了我遇到的每一个技巧来授予测试android.permission.WRITE\u EXTERNAL\u STORAGE的权限,但没有成功

我(未成功)尝试过:

  • adb shell pm grant ca.mahram.android.testextstorexfer android.permission.WRITE_EXTERNAL_STORAGE
    ->不允许操作:java.lang.SecurityException:Package ca.mahram.android.testextstorexfer未请求权限android.permission.WRITE_EXTERNAL_STORAGE
  • adb shell pm grant ca.mahram.android.testextstorexfer.test android.permission.WRITE_EXTERNAL_STORAGE
    ->失败,出现
    FileNotFoundException
    (权限被拒绝)
  • @Rule public GrantPermissionRule permissionRule=GrantPermissionRule.grant(Manifest.permission.WRITE\u外部存储)->失败,出现
    FileNotFoundException
    (权限被拒绝)
  • InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand(“pm grant”+InstrumentationRegistry.getContext().getPackageName()+“”+清单.权限.写入外部存储)->失败,出现
    FileNotFoundException
    (权限被拒绝)
  • InstrumentationRegistry.getInstrumentation().getUiAutomation().executeShellCommand(“pm grant”+InstrumentationRegistry.getTargetContext().getPackageName()+“”+Manifest.permission.WRITE\u外部存储)->失败,出现
    FileNotFoundException
    (权限被拒绝)
我所需要的就是在运行测试之前,将这些资产放在
下载
文件夹中。我遇到的每个解决方案都是关于授予应用程序权限的,而我还没有找到任何关于授予测试apk权限的方法

我完全没有主意了。如何准备这些资产?有更好的方法吗


下面是Github上的示例代码:

我遇到了完全相同的问题。正在测试的应用程序只需要读取外部存储,测试还需要写入外部存储。有趣的是,当应用程序本身仍然请求(ands被授予)写入外部存储时,测试也可以使用该存储…@JensMüller是的,这就是为什么我尝试为测试添加清单,并将权限更改为
写入外部存储
,但我认为
androidTest/Androidmanifest.xml
的使用方式与其他方法不同,例如
debug/Androidmanifest.xml
您可以运行InstrumentationRegistry.getContext().getAssets().open(“PATHTOFILE”)从资产目录中读取