我正在尝试对此代码进行单元测试:
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吗?谢谢。
答案 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的测试是重要的部分。