我的 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/