模拟android.os.BaseBundle没有roboelectric

时间:2017-12-15 10:15:43

标签: android unit-testing

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

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吗?谢谢。

3 个答案:

答案 0 :(得分:1)

1)添加适当的设置

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

2)使用vanilla Mockito作为do().when()

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

3)使用Powermock进行whenNew()

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:-1)

我终于得到了朋友的回答。原因是以某种方式使用powermockito模拟android类,主类需要设置为测试准备:

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

感谢@Maciej Kowalski的努力。我会投票支持你的努力,因为无论如何它都是正确的方向。

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