相关疑难解决方法(0)

如何使用Robolectric对PackageManager进行阴影处理

我的Android应用程序有一个简单的方法来启动显示URL的意图.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Robolectric进行单元测试,但我无法验证这种方法.具体来说,getPackageManager()始终返回null.我怎么能影子PackageManager呢?我尝试创建一个ShadowPackageManager并调用bindShadowClass,但我的代码都没有被执行 - getPackageManager()总是返回null.我也尝试了Shadow the Application上下文并返回一个具体的StubPackageManager,但得到了相同的结果.也许我一直在寻找/盯着太长时间 - 有没有更好的方法对这种方法进行单元测试?

android shadow robolectric

13
推荐指数
2
解决办法
8788
查看次数

如何将Mockito设置为Android单元测试的模拟类

如果我做一个简单的测试用例

@Test
public void myTest() throws Exception {
    Spanned word = new SpannedString("Bird");
    int length = word.length();
}
Run Code Online (Sandbox Code Playgroud)

抛出异常

java.lang.RuntimeException:未模拟android.text.SpannableStringInternal中的方法长度.有关详细信息,请参阅 http://g.co/androidstudio/not-mocked.

这在上面的链接中解释为

用于运行单元测试的android.jar文件不包含任何实际代码 - 由真实设备上的Android系统映像提供.相反,所有方法都抛出异常(默认情况下).这是为了确保您的单元测试仅测试您的代码,而不依赖于Android平台的任何特定行为(您没有明确嘲笑,例如使用Mockito).

那么你如何在Android项目中设置Mockito以模拟这样的类?

我想学习,所以我将在Q&A风格下添加我的答案.

android unit-testing mockito

4
推荐指数
1
解决办法
5456
查看次数

标签 统计

android ×2

mockito ×1

robolectric ×1

shadow ×1

unit-testing ×1