【问题标题】:Android Unit Test giving not mocked message for a Mockito stubbed methodAndroid单元测试为Mockito存根方法提供未模拟消息
【发布时间】:2015-04-25 17:07:19
【问题描述】:

我创建了以下测试方法,在其中模拟 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.

有人有什么想法吗?

【问题讨论】:

    标签: java android unit-testing mockito


    【解决方案1】:

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

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

    @PrepareForTest({Settings.Secure.class})
    

    为了模拟你需要的对象:

    PowerMockito.mockStatic(Settings.Secure.class);
    

    那你可以试试:

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

    最后,你可以测试一下:

    verifyStatic();
    

    【讨论】:

    • 在嘲笑Settings.Secure.class的时候,发现Settings这个类也需要“准备”:@PrepareForTest({Settings.class, Settings.Secure.class})
    【解决方案2】:

    尝试添加

    testOptions {
        unitTests.returnDefaultValues = true
    }
    

    在你的build.gradle

    更多信息在这里http://tools.android.com/tech-docs/unit-testing-support

    【讨论】:

    • 谢谢。我知道这个设置,但是如果你正在模拟框架方法,那么这个异常肯定不应该被抛出,这个设置应该是不必要的吗?这是文档的建议。
    • 当我添加该设置时,我收到以下错误,所以我怀疑这是相关的:org.mockito.exceptions.misusing.MissingMethodInvocationException: when() requires an argument which has to be 'a method call on a mock.
    【解决方案3】:

    Settings.Secure.getString 是一个静态方法,所以mock(Settings.Secure.class) 不会模拟它。即使继承 Settings.Secure 并创建自己的静态 getString 也无济于事。

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

    【讨论】:

      猜你喜欢
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多