【问题标题】:How to set up Mockito to mock class for Android unit test如何设置 Mockito 来模拟 Android 单元测试的类
【发布时间】:2017-12-05 04:07:23
【问题描述】:

如果我做一个简单的测试用例,比如

@Test
public void myTest() throws Exception {
    Spanned word = new SpannedString("Bird");
    int length = word.length();
}

抛出异常

java.lang.RuntimeException:方法长度在 android.text.SpannableStringInternal 没有被嘲笑。看 http://g.co/androidstudio/not-mocked了解详情。

这在上面的链接中解释为

用于运行单元测试的 android.jar 文件不包含 任何实际代码 - 由 Android 系统映像提供 设备。相反,所有方法都会抛出异常(默认情况下)。这是 确保您的单元测试只测试您的代码而不依赖于 Android 平台的任何特定行为(您没有 明确嘲笑,例如使用 Mockito)。

那么如何在 Android 项目中设置 Mockito 以模拟这样的类?

我想学习,所以我将在问答样式下方添加我的答案。

【问题讨论】:

    标签: android unit-testing mockito


    【解决方案1】:

    在您的项目中设置 Mockito 并不难。步骤如下。

    1。添加 Mockito 依赖项

    假设您使用的是 jcenter 存储库(Android Studio 中的默认设置),将以下行添加到您应用的 build.gradle 文件的 dependencies 块中:

    testImplementation "org.mockito:mockito-core:2.8.47"
    

    您可以将版本号更新为 most recent Mockito version 的任何值。

    它应该看起来像这样:

    dependencies {
        // ...
        testImplementation 'junit:junit:4.12'
        testImplementation "org.mockito:mockito-core:2.8.47"
    }
    

    2。将 Mockito 导入您的测试类

    通过导入静态类,您可以使代码更具可读性(即,您可以使用mock(),而不是调用Mockito.mock())。

    import static org.mockito.Mockito.*;
    

    3。在您的测试中模拟对象

    你需要做三件事来模拟对象。

    1. 使用mock(TheClassName.class) 创建一个模拟类。
    2. 告诉模拟类为您需要调用的任何方法返回什么。您可以使用whenthenReturn 执行此操作。
    3. 在您的测试中使用模拟方法。

    这是一个例子。真正的测试可能会使用模拟值作为被测试内容的某种输入。

    public class MyTestClass {
    
        @Test
        public void myTest() throws Exception {
            // 1. create mock
            Spanned word = mock(SpannedString.class);
    
            // 2. tell the mock how to behave
            when(word.length()).thenReturn(4);
    
            // 3. use the mock
            assertEquals(4, word.length());
        }
    }
    

    进一步研究

    Mockito 还有很多其他功能。请参阅以下资源以继续学习。

    或者试试这个...

    学习 mocking 很好,因为它速度快并且可以隔离正在测试的代码。但是,如果您正在测试一些使用 Android API 的代码,那么只使用仪器测试而不是单元测试可能更容易。见this answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多