如何将Mockito设置为Android单元测试的模拟类

时间:2017-07-01 09:17:40

标签: android unit-testing mockito

如果我做一个像

这样的简单测试用例
@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以模拟这样的类?

我想学习,所以我将在Q& A风格下添加我的答案。

1 个答案:

答案 0 :(得分:8)

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

1。添加Mockito依赖

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

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

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

看起来应该是这样的:

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

2。将Mockito导入您的测试类

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

import static org.mockito.Mockito.*;

3。在测试中模拟对象

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

  1. 使用mock(TheClassName.class)创建类的模拟。
  2. 告诉模拟类要为您需要调用的任何方法返回什么。您可以使用whenthenReturn执行此操作。
  3. 在测试中使用模拟方法。
  4. 这是一个例子。一个真正的测试可能会使用模拟值作为正在测试的任何内容的某种输入。

    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还有很多其他内容。请参阅以下资源以继续学习。

    或试试这个......

    学习模拟是很好的,因为它很快并隔离了被测试的代码。但是,如果您正在测试一些使用Android API的代码,则可能更容易使用检测测试而不是单元测试。请参阅this answer