我正在为我的应用程序开发一个测试用例,它应该验证文件导入操作的正确性。为了自动测试,我的计划是将我的测试资产目录中的文件复制到被测设备的下载文件夹中,并使用Espresso测试用例执行导入操作。
有人有经验吗?我遇到的问题是我的测试用例无权向设备写入任何内容。
到目前为止,我已经为包含所需权限的测试应用程序创建了一个专用的manifest.xml文件:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
此外,我在测试开始之前执行此操作,以便为测试用例授予所需的权限:
adb shell pm grant com.my_app_pacakge.test android.permission.WRITE_EXTERNAL_STORAGE
不幸的是,当我在下载目录中创建文件时,在我尝试将内容写入备份文件时抛出以下异常:
Caused by: java.io.FileNotFoundException: /storage/emulated/0/Download/small_backup: open failed: EACCES (Permission denied)
相关代码如下:
public void putBackupFile(String name ){
File backupFile = new File(Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS ).getPath(), name );
try {
InputStream is = InstrumentationRegistry.getInstrumentation().getContext().getAssets().open( name );
FileOutputStream fileOutputStream = new FileOutputStream(backupFile);
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, len);
}
fileOutputStream.close();
is.close();
} catch (IOException e1) {
throw new RuntimeException(e1);
}
}
在FileOutputStream fileOutputStream = new FileOutputStream(backupFile);
答案 0 :(得分:0)
我意识到我的问题中的appraoch状态并不是最好的方法:我用另一种方式解决了这个问题:使用adb命令行传输所需的文件:
adb push small_backup / mnt / sdcard / Download
此语句已集成在我的测试设置中(在运行测试之前执行)。在测试用例中,我理所当然地认为所需的文件是可用的。
答案 1 :(得分:0)
回答原始问题:如果您从adb授予android.permission.WRITE_EXTERNAL_STORAGE,您还必须授予android.permission.READ_EXTERNAL_STORAGE:
adb shell pm grant com.my_app_pacakge.test android.permission.READ_EXTERNAL_STORAGE
似乎如果在应用程序中要求WRITE权限,则会自动询问/授予READ权限。如果从adb执行此操作,则必须另外授予READ权限。