希望对方法assertActivityRequiresPermission和assertReadingContentUriRequiresPermission有所帮助。它没有表现出我认为的方式,也没有看到我哪里出了问题。
我的理解是,可以通过在AndroidManifest.xml中的相应标签(和)中添加android:permission来保护活动和提供者。要声明客户活动具有启动和活动或与提供者合作的必要权限,我们在标记下声明了我认为处于“包”级别的内容。
因此,为了测试AndroidTestCase中的assert方法如何工作,我设置了一个HelloWorld项目和一个用于测试HelloWorld的项目。这是HelloWorld的清单。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloandroid"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".HelloAndroidActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".RecipientActivity"
android:label="@string/app_name"
android:permission="android.permission.RECEIVE_SMS" >
</activity>
</application>
</manifest>
我的RecipientActivity受RECEIVE_SMS保护,因此我声明使用RECEIVE_SMS,以便HelloAndroidActivity能够启动RecipientActivity。
现在在我的测试课中
public class TestRecipientActivity extends AndroidTestCase {
public void testPermissions() {
String packageName = "com.example.helloandroid";
String className = packageName + ".RecipientActivity";
String permission = android.Manifest.permission.RECEIVE_SMS;
assertActivityRequiresPermission(packageName, className, permission);
}
public void testContactsPermissions() {
final Uri URI = ContactsContract.AUTHORITY_URI;
final String permission = android.Manifest.permission.READ_CONTACTS;
assertReadingContentUriRequiresPermission(URI, permission);
}
}
结果呢?
testPermissions()失败,并显示“ AssertionFailError:预期的安全异常”,这表示RecipientActivity已成功启动且未引发SecurityException。
尽管我没有在任何地方定义,但通过了testContactsPermissions()却没有引发任何异常。
谁能解释为什么我得到上述结果?谢谢!
最佳答案
您很久以前就问过这个问题,我不知道您是否已经解决了。
我正在学习Android中的单元测试,但遇到了同样的问题。最初,我以为assertActivityRequiresPermission()方法会测试中声明的权限,但是后来我意识到该方法仅测试是否存在与作为参数传递的活动相关联的特定权限。
您正在将相同的权限与和标记相关联。关键是,如果您从中删除权限,则断言有效。我认为问题在于此断言期望发生SecurityException,因为没有权限就无法启动该活动,但是您正在manifest.xml中使用该权限,因此不会引发异常。