Android Unit Test为Mockito存根方法提供了非模拟消息

时间:2015-04-25 17:07:19

标签: java android unit-testing mockito

我创建了以下测试方法,我在其中模拟了Settings.Secure并存根该类的getString方法。

@Test
public void testIsDevicePostOwner() throws Exception {
    String mockDeviceId = "2c3977ad-0867-49d6-aad8-c2762f373551";

    Post mockedPost = mock(Post.class);

    Settings.Secure mockedSecure = mock(Settings.Secure.class);

    ContentResolver mockContentResolver = mock(ContentResolver.class);

    when(mockedSecure.getString(mockContentResolver, Settings.Secure.ANDROID_ID)).thenReturn(mockDeviceId);
}

当我运行测试时,我收到以下错误:

java.lang.RuntimeException: Method getString in android.provider.Settings$Secure not mocked.

有人有什么想法吗?

3 个答案:

答案 0 :(得分:1)

尝试添加

testOptions {
    unitTests.returnDefaultValues = true
}

build.gradle

此处有更多信息http://tools.android.com/tech-docs/unit-testing-support

答案 1 :(得分:1)

如果要模拟静态方法,请使用PowerMock

您需要使用PowerMockRunner运行并准备测试类:

@PrepareForTest({Settings.Secure.class})

用于模拟您需要的对象:

PowerMockito.mockStatic(Settings.Secure.class);

然后你可以尝试:

when(Settings.Secure.getString(mockContentResolver, Settings.Secure.ANDROID_ID)).thenReturn(mockDeviceId);

最后,你可以测试一下:

verifyStatic();

答案 2 :(得分:0)

Settings.Secure.getString是一种静态方法,因此mock(Settings.Secure.class)不会嘲笑它。即使继承Settings.Secure并创建自己的静态getString也无济于事。

我不确定在这种情况下是否有任何可以帮助你的反射魔法;没有人想到。