AndroidTestCase - assertActivityRequiresPermission和assertReadingContentUriRequiresPermission

时间:2011-11-11 04:39:19

标签: android

希望对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>

我有RECEIVE_SMS保护的RecipientActivity,因此我声明使用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:expected security exception',这意味着RecipientActivity已成功启动且未抛出SecurityException。

虽然我没有在任何地方定义,但是传递了testContactsPermissions()而没有抛出任何异常。

任何人都可以解释为什么我得到上述结果?谢谢!

1 个答案:

答案 0 :(得分:1)

很久以前你问了这个问题,我不知道你是否已经解决了这个问题。

我正在Android中学习单元测试,我遇到了同样的问题。在开始时我认为方法assertActivityRequiresPermission()测试在&lt;中声明的权限。 uses-permission&gt;,但后来我意识到这个方法只测试是否存在与作为参数传递的活动相关的特定权限。

您正在将相同的权限与&lt; uses-permission&gt;和&lt;活动&gt;标签。关键是如果从&lt;中删除权限,则断言有效。 uses-permission&gt;。我认为问题是这个断言期望导致SecurityException,因为它无法在没有权限的情况下启动活动,但是您在manifest.xml中使用了该权限,因此不会抛出异常。