如何在androidTest测试中创建测试资产并授予运行时权限?
在您将其标记为复制之前,请注意,这并不是授予被测应用程序权限,而是测试apk本身 在我的应用程序中,有一个功能可以从如何在androidTest测试中创建测试资产并授予运行时权限?,android,android-testing,runtime-permissions,Android,Android Testing,Runtime Permissions,在您将其标记为复制之前,请注意,这并不是授予被测应用程序权限,而是测试apk本身 在我的应用程序中,有一个功能可以从下载目录(/sdcard/Download)获取一个文件,对其进行验证,并将其复制到应用程序的私有存储(/data/data/com.package.myapp/files/)中,以便在需要时可以使用该文件 为了测试这个功能,我需要在下载目录中放置一些测试文件:一些是已知的有效文件,另一些是已知的无效文件。我已将这些文件放在androidTest组的assets目录中 在我的测试类
下载目录(/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的权限,但没有成功
我(未成功)尝试过:
->不允许操作:java.lang.SecurityException:Package ca.mahram.android.testextstorexfer未请求权限android.permission.WRITE_EXTERNAL_STORAGEadb shell pm grant 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”)从资产目录中读取