Mockito Uri.parse 总是返回 null

新手上路,请多包涵

我有这样的制作方法:

 public boolean onShouldOverrideUrlLoading(String url) {
    boolean isConsumed = false;
    if (url.contains("code=")) {
         Uri uri = Uri.parse(url);
         String authCode = uri.getQueryParameter("code");
         mView.authCodeObtained(authCode);
         isConsumed = true;
    }
    return isConsumed;
}

我有这个 Mockito 测试方法:

 @Test
public void onShouldOverrideUrlLoadingOnAuthCodeObtained(){

    String code = "someCode";

    boolean isConsumed = mPresenter.onShouldOverrideUrlLoading("http://localhost/?code=" + code);

    verify(mView, times(1)).authCodeObtained(code);
    assertEquals(isConsumed, true);
}

但似乎一旦代码运行并到达 Uri.parse(url),我就会得到一个空指针。我错过了什么?在生产中这完美地工作。仅在测试时,Uri.parse() 返回 null。

谢谢!

原文由 Alon Minski 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 681
2 个回答

问题可能在于 Uri 类,因为被测试的代码是静态代码( Uri.parse(...) ), Uri 环境可能是 test bad-izing-请注意,Android SDK 中有两个 uri 类:

我不是 Android 开发人员,但您可能需要检查测试环境。

原文由 Brice 发布,翻译遵循 CC BY-SA 3.0 许可协议

最终,我在 Mockito 之上使用 PowerMock 来模拟 Uri 类。使用这些依赖项来添加它:

 'org.powermock:powermock-api-mockito:1.4.12'
'org.powermock:powermock-module-junit4:1.6.2'

在这里 阅读。

它使您能够模拟静态方法、私有方法、最终类等。在我的测试方法中,我使用了:

 PowerMockito.mockStatic(Uri.class);
Uri uri = mock(Uri.class);

PowerMockito.when(Uri.class, "parse", anyString()).thenReturn(uri);

这通过了实际代码中的行并返回了一个 Mocked Uri 对象,因此测试可以继续进行。确保添加:

 @RunWith(PowerMockRunner.class)
@PrepareForTest({Uri.class})

作为测试类名称顶部的注释。

使用 Robolectric 来解决这个问题也是一种有效的技术。

希望这会有所帮助。

原文由 Alon Minski 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题