【发布时间】:2018-08-18 07:34:10
【问题描述】:
我想为一个涉及写入外部存储的应用程序写一个AndroidTest,但不知何故我无法让它工作。 (在Pixel2、LG G6、华为P8等多台设备上测试)
所以我简化了一切,只是为了测试是否可以写入外部存储。我尝试了GrantPermissionRule 并在Granter 上写了我的文章,但完全没有成功。
我可能最终做了太多不必要的事情,所以这就是我所做的:
- 在
AndroidStudio中创建没有活动的新项目 - 为清单添加了权限
- 添加了
AndroidManifest和uses-permission标签 - 写了我自己的
PermissionRequester - 编写测试尝试在/sdcard/Download中添加一个文件夹并删除它
以下是上面编号列表引用的sn-ps
2.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company.android.testpermissions">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="com.company.TestPermissions"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" />
</manifest>
3.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company.android.testpermissions.test">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>
也试过了
<manifest package="com.company.android.testpermissions">...
省略“测试”后缀
4.
public class MyPermissionRequester {
public static final String TAG = MyPermissionRequester.class.getSimpleName();
public static void request(String... permissions) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
UiAutomation auto = InstrumentationRegistry.getInstrumentation().getUiAutomation();
String cmd = "pm grant " + InstrumentationRegistry.getTargetContext().getPackageName() + " %1$s";
String cmdTest = "pm grant " + InstrumentationRegistry.getContext().getPackageName() + " %1$s";
String currCmd;
for (String perm : permissions) {
execute(String.format(cmd, perm), auto);
execute(String.format(cmdTest, perm), auto);
}
}
GrantPermissionRule.grant(permissions);
}
private static void execute(String currCmd, UiAutomation auto){
Log.d(TAG, "exec cmd: " + currCmd);
auto.executeShellCommand(currCmd);
}
}
5.
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void sdcardTest(){
//check sdcard availability
Assert.assertEquals("Media is not mounted!", Environment.getExternalStorageState(), Environment.MEDIA_MOUNTED);
//get and check Permissions
MyPermissionRequester.request(Manifest.permission.WRITE_EXTERNAL_STORAGE);
int grantResult = ActivityCompat.checkSelfPermission(InstrumentationRegistry.getTargetContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
Assert.assertEquals(PackageManager.PERMISSION_GRANTED, grantResult);
grantResult = ActivityCompat.checkSelfPermission(InstrumentationRegistry.getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
Assert.assertEquals(PackageManager.PERMISSION_GRANTED, grantResult);
//finally try to create folder
File f = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "CompanyTest");
if (!f.exists()){
boolean mkdir = f.mkdirs();
Assert.assertTrue("Folder '"+f.getAbsolutePath() + "' not Present!", mkdir);
}
boolean delete = f.delete();
Assert.assertTrue("Folder '"+f.getAbsolutePath() + "' is Present!", delete);
}
}
测试结果是:
junit.framework.AssertionFailedError: 文件夹 '/storage/emulated/0/Download/CompanyTest' 不存在!在
junit.framework.Assert.fail(Assert.java:50) 在
junit.framework.Assert.assertTrue(Assert.java:20) 在
com.company.android.testpermissions.ExampleInstrumentedTest.sdcardTest(ExampleInstrumentedTest.java:69)
在 java.lang.reflect.Method.invoke(Native Method) 在 ... (省略了来自 TestRunner 的其余部分)
我在这里遗漏了什么或做错了什么?
【问题讨论】:
标签: java android testing android-permissions android-external-storage