android - 如何使用 Robolectric 隐藏 PackageManager

标签 android shadow robolectric

我的 Android 应用程序有一个简单的方法来触发显示 URL 的 Intent 。

protected void launchBrowser(int id)
{
    Uri uri = Uri.parse( getString( id ) );
    Intent intent = new Intent( ACTION_VIEW, uri);

    PackageManager packageManager = getPackageManager();
    List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
    if (activities.size() > 0)
    {
        startActivity(intent);
    }
    else
    {
        Toast.makeText(getApplicationContext(),
                       "ERROR - no application to display a web page",
                       Toast.LENGTH_SHORT).show();
    }
}

我正在使用 Robolectric 进行单元测试,但我无法验证此方法。具体来说,getPackageManager() 总是返回 null。我如何隐藏 PackageManager?我尝试创建一个 ShadowPackageManager 并调用 bindShadowClass,但是我的代码都没有被执行 - getPackageManager() 总是返回 null。我还尝试隐藏应用程序上下文并返回具体的 StubPackageManager,但得到了相同的结果。 也许我一直在寻找/盯着太久 - 是否有更好的方法来对该方法进行单元测试?

最佳答案

我为此使用 Robolectric 2.3。如其他答案所述,getPackageManager() 不返回 null,但 shadowApplication.setPackageManager 不再存在。

因为你不能模拟 PackageManager,你不能给它一个 Intents 的列表来解析。幸运的是,Robolectric 的 PackageManager 子类 RobolectricPackageManager 可以让您无需模拟即可添加这些 Intent :

RobolectricPackageManager rpm = (RobolectricPackageManager)Robolectric.application.getPackageManager();
rpm.addResolveInfoForIntent(new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS), new ResolveInfo());

关于android - 如何使用 Robolectric 隐藏 PackageManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12902777/

相关文章:

android - 如何单元测试 FragmentDialog 和实现接口(interface)的 Activity 之间的交互

android - 如何获取其他应用程序的通知图标?

java - 如何从 photo_id 获取 photo_uri

css - 如何检查浏览器是否支持影子 DOM

android - Robolectric Resources$NotFoundException :drawable\abc_ic_ab_back_material. 来自可绘制资源 ID 的 xml

android - 在 Robolectric 中模拟单击菜单项

Java SendHttpPost 返回 null JSONObject

Android:拖放后,被拖动的editText消失

html - 文本阴影显示在同一元素的前一行文本之上

css - Angular 落里的文字阴影轮廓不完整