美文网首页
Mock和Mockito简单理解和使用

Mock和Mockito简单理解和使用

作者: FORGET_静哥哥 | 来源:发表于2019-02-28 15:07 被阅读0次

什么是Mock?

1.Mockito是mocking框架,它让你用简洁的API做测试。而且Mockito简单易学,它可读性强和验证语法简洁。
2.在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象。
3.程序员通常创造模拟对象来测试其他对象的行为,很类似汽车设计者使用碰撞测试假人来模拟车辆碰撞中人的动态行为。

@Mock与@InjectMocks的区别
@Mock: 创建一个Mock.
@InjectMocks: 创建一个实例,简单的说是这个Mock可以调用真实代码的方法,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中。

  • 相同:Stub和Mock都是模拟外部依赖
  • 不同:Stub是完全模拟一个外部依赖, 而Mock还可以用来判断测试通过还是失败

注意:必须使用@RunWith(MockitoJUnitRunner.class)Mockito.initMocks(this)进行mocks的初始化和注入。

@RunWith(MockitoJUnitRunner.class)  
public class Test {  
  
    @InjectMocks  
    private SomeHandler someHandler;  
  
    @Mock  
    private OneDependency oneDependency; // 此mock将被注入到someHandler  

    // ...   
}  

为什么要使用Mock?

在单元测试中,模拟对象可以模拟复杂的、真实的(非模拟)对象的行为, 如果真实的对象无法放入单元测试中,使用模拟对象就很有帮助。

在下面的情形,可能需要使用模拟对象来代替真实对象:

  • 真实对象的行为是不确定的(例如,当前的时间或当前的温度);
  • 真实对象很难搭建起来;
  • 真实对象的行为很难触发(例如,网络错误);
  • 真实对象速度很慢(例如,一个完整的数据库,在测试之前可能需要初始化);
  • 真实的对象是用户界面,或包括用户界面在内;
  • 真实的对象使用了回调机制; 真实对象可能还不存在;
  • 真实对象可能包含不能用作测试(而不是为实际工作)的信息和方法。

例如,一个可能会在特定的时间响铃的闹钟程序可能需要外部世界的当前时间。要测试这一点,测试一直要等到闹铃时间才知道闹钟程序是否正确地响铃。如果使用一个模拟对象替代真实的对象,可以变成提供一个闹铃时间(不管是否实际时间),这样就可以隔离地测试闹钟程序。-------来源维基百科

使用场景

  • 提前创建测试; TDD(测试驱动开发)
  • 团队可以并行工作
  • 你可以创建一个验证或者演示程序
  • 为无法访问的资源编写测试
  • Mock 可以交给用户
  • 隔离系统

Mockito的简单使用

Mockito是GitHub上使用最广泛的Mock框架,并与JUnit结合使用.Mockito框架可以创建和配置mock对象.使用Mockito简化了具有外部依赖的类的测试开发!
一般使用Mockito的步骤:

  1. 模拟任何外部依赖并将这些模拟对象插入测试代码中
  2. 执行测试中的代码 验证代码是否按照预期执行执行测试中的代码
  3. 验证代码是否按照预期执行验证代码是否按照预期执行
在这里插入图片描述

配置依赖

如果我们在Java项目中使用的是Gradle编译,应在Gradle的构建文件中添加:

repositories { jcenter() }
dependencies { testCompile "org.mockito:mockito-core:2.+" }

添加maven依赖:

    <dependency>
          <groupId>org.mockito</groupId>
          <artifactId>mockito-all</artifactId>
          <version>1.9.5</version>
          <scope>test</scope>
      </dependency>

添加junit依赖:

<dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
      </dependency>

验证我们的交互逻辑

import static org.mockito.Mockito.*;
/**
 * Created by zhanglulu on 2018/1/31.
 */
public class MyMockitoTest {
    @Test
    public void testMockitoTest() {
        // mock creation
        List mockedList = mock(List.class);

        // using mock object - it does not throw any "unexpected interaction" exception
        //使用模拟对象(而不是真实创建出来的对象那)
        mockedList.add("one");
        mockedList.clear();

        // selective, explicit, highly readable verification
        verify(mockedList).add("one");
        verify(mockedList).clear();
    }
}

可以在代码中打桩(stub)

import static org.mockito.Mockito.*;
/**
 * Created by zhanglulu on 2018/1/31.
 */
public class MyMockitoTest {
    @Test
    public void testMockitoTest() {
        // you can mock concrete classes, not only interfaces
        LinkedList mockedList = mock(LinkedList.class);
        
        // stubbing appears before the actual execution
        when(mockedList.get(0)).thenReturn("first");

        // the following prints "first"
        System.out.println(mockedList.get(0));

        // the following prints "null" because get(999) was not stubbed
        System.out.println(mockedList.get(999));
    }
}

执行结果:

first
null

相关文章

  • Mock和Mockito简单理解和使用

    什么是Mock? 1.Mockito是mocking框架,它让你用简洁的API做测试。而且Mockito简单易学,...

  • Mock和Mockito简介

    本篇对Mock和Mockito做了简单的介绍,并列出了简单的示例.使用Mockito需要基于JUnit,所以不了解...

  • Mockito初级学习

    标签:mockito 使用Mockito来Mock对象 有两种方法来mock对象,1)使用静态方法: mock()...

  • mock单元测试 mockito实践

    1基本的使用步骤 1,环境使用mock和test包 2,使用mockitoRule构造mockito环境 @Rul...

  • Android单元测试-Mockito

    本文记录Mockito的简单使用。CSDN同步发布 Mockito概念相关 Mock就是创建一个类的虚假对象,在测...

  • Mockito的使用

    Mockito的使用 1,Mockito的介绍 1.1 什么是mock测试? Mock测试就在测试过程中,对于某些...

  • 三种mock注入方式了解一下

    在前一篇文章中,简要介绍了Mockito的引入和使用。本篇来介绍一下Mockito的三种mock注入方式。 使用@...

  • Mockito和PowerMock用法

    Mockito和PowerMock用法 一、mock测试和Mock对象 mock对象就是在调试期间用来作为真实对象...

  • Mockito使用总结

    Mockito介绍 Mockito就是一个优秀的用于单元测试的mock框架。在软件开发中提及”mock”,通常理解...

  • 优雅单测-3用Mockito轻松解决复杂的依赖问题

    1.Mockito Mockito是GitHub上用于Java使用最广泛的Mock框架 Mockito核心解决的问...

网友评论

      本文标题:Mock和Mockito简单理解和使用

      本文链接:https://www.haomeiwen.com/subject/jdohuqtx.html