【问题标题】:Mock android.os.BaseBundle without roboelectric模拟没有 robolectric 的 android.os.Base Bundle
【发布时间】:2018-05-29 12:47:51
【问题描述】:

我正在尝试对此代码进行单元测试:

Bundle cidParam(String accountId) {
    Bundle params = new Bundle(1);
    params.putString(Params.CID, accountId);

    return params;
}

这是单元测试:

private void mockBundle(String cid) throws Exception {
    Bundle mBundle = PowerMockito.mock(Bundle.class);
    PowerMockito.doNothing().when((BaseBundle)mBundle).putString(AnalyticsController.Params.CID, cid);
}

但是,它总是返回:

java.lang.RuntimeException: Method putString in android.os.BaseBundle not mocked.

我知道我可以使用 roboelectric 来启动模拟器并调用真正的捆绑包。但是,它会减慢单元测试的速度。有谁知道如何模拟 Android .os.base?谢谢。

【问题讨论】:

  • 你能否重构new Bundle(1); 可以移动到单独的包级方法?

标签: java android unit-testing mockito powermock


【解决方案1】:

尝试将其添加到您的 build.gradle

android {
    testOptions {
        unitTests {
            unitTests.returnDefaultValues = true
        }
    }
}

【讨论】:

  • 这样做意味着没有权力模拟 - 耶!谢谢。
【解决方案2】:

我终于从我的朋友那里得到了答案。原因是为了使用 powermockito 模拟 android 类,主类也需要设置为准备测试:

@PrepareForTest({MainClass.class, Bundle.class})

感谢您@Maciej Kowalski 的努力。我会为你的努力投票,因为它的方向是正确的。

我不是复制粘贴上面的答案,为 MainClass 准备测试是重要的部分。

【讨论】:

  • 不,它相似但不同,看看 MainClass.class 部分,这是重要的部分。没有它就行不通,而上面的答案只是要求我为 Bundle.class 而不是 MainClass 准备测试。
【解决方案3】:

1) 添加适当的设置

@RunWith(PowerMockRunner.class)
@PrepareForTest(Bundle.class)
public class MyTest{

2)do().when() 使用香草 Mockito:

Bundle mBundle = PowerMockito.mock(Bundle.class);
    Mockito.doNothing().when(mBundle).putString(AnalyticsController.Params.CID, cid);

3)whenNew() 使用 Powermock:

PowerMockito.whenNew(Bundle.class)
            .withAnyArguments().thenReturn(mBundle);

【讨论】:

  • 嗨@Maciej Kowalski 谢谢你的帮助。我把你的代码放进去,但还是不行。它返回相同的错误。我真的很好奇为什么它不起作用。为什么错误说 android.os.BaseBundle not mocked 是父类?为什么它不能被嘲笑,是因为 Bundle 类是 final 的吗?如果您有更多见解,请告诉我。谢谢
  • 好的,那么你需要 PowerMock.createMock(Bundle.class);而不是 Mockito.mock
  • 抱歉PowerMockito.mockPowerMock.createMock 有什么区别?
  • 是的,实际上它应该是 PowerMockito.mock.. 告诉我你还在尝试投射 (BaseBundle) 吗?
  • 嗨@MaciejKowalski 我确实试过这个:Bundle mBundle = PowerMockito.mock(Bundle.class); PowerMockito.whenNew(Bundle.class).withAnyArguments().thenReturn(mBundle); 但没用。它显示了相同的结果。我的Android开发者朋友说不可能吗?你怎么看?
猜你喜欢
  • 1970-01-01
  • 2014-03-11
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多