前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >IDEA 中如何使用Mockito框架

IDEA 中如何使用Mockito框架

作者头像
louiezhou001
发布2020-03-25 11:13:25
4.1K0
发布2020-03-25 11:13:25
举报

在之前的文章中我们分享过一些非常知名的测试框架, Mockito就是其中之一, 在分享Mockit之前, 先聊聊它处在哪个部分?

在单元测试自动化体系里有4个关键部分组成:

  1. 构建管理: Maven/Gradle 项目管理和构建工作
  2. 代码管理Git/Perforce
  3. 集成和分析管理:持续集成Jenkins, 代码分析Sonar
  4. 测试框架: Junit/Mockito/TestNG

Mockito是一种针对java的Mocking框架, 它与EasyMock 和JMock很相似, 通过在执行后校验什么已经被调用,消除了对期望行为(expections)的需要, 其他的mocking库需要你在执行前记录期望行为, 而导致了丑陋的初始化代码. Mockito让代码更贴近自然语言,便于阅读.

大多 Java Mock 库如 EasyMock 或 JMock 都是 expect-run-verify (期望-运行-验证)方式,而 Mockito 则使用更简单,更直观的方法, 在执行后的互动中提问。使用 Mockito,你可以验证任何你想要的 . Mockito无需准备昂贵的前期启动。他们的目标是透明的,让开发人员专注于测试选定的行为。

Mockito拥有的非常少的API,所有开始使用 Mockito,几乎没有时间成本。因为只有一种创造 mock 的方式。只要记住,在执行前 stub,而后在交互中验证。你很快就会发现这样 TDD java 代码是多么自然。

Mockito 语法流程

代码语言:javascript
复制
Mockito

    Mock
        mock(Class classToMock); 
        mock(Class classToMock, String name)

    Stub
        when(mock.someMethod()).thenReturn(value) 
        when(mock.someMethod()).thenThrow(new RuntimeException)
        when(mock.someMethod()).thenAnswer()

    exec

首先要利用mock来构造依赖,其次利用when语句来构造stub,然后就可以执行测试方法了

如何使用Mockito

  1. 在Intellij IDEA中创建Maven项目
  2. 在pom.xml添加依赖包
代码语言:javascript
复制
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>2.15.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

来看下maven导入的mockito包是什么样的

接下来就是创建测试类在src/test/java 目录里

代码语言:javascript
复制
package com.portal.mock;

import org.testng.annotations.Test;

import java.util.LinkedList;
import java.util.List;

import static org.mockito.Mockito.*;

public class MockTest {


    @Test
    public void testA(){
        //You can mock concrete classes, not just interfaces
        LinkedList mockList=mock(LinkedList.class);


        //using mock
        mockList.add("once");

        mockList.add("twice");
        mockList.add("twice");

        mockList.add("three times");
        mockList.add("three times");
        mockList.add("three times");

        //following two verifications work exactly the same - times(1) is used by default
        verify(mockList).add("once");
        verify(mockList,times(1)).add("once");

        //exact number of invocations verification
        verify(mockList, times(2)).add("twice");

        verify(mockList,times(3)).add("three times");

        //verification using never(). never() is an alias to times(0)
        verify(mockList,never()).add("never happend");

        //verification using atLeast()/atMost()
        verify(mockList,atLeastOnce()).add("three times");
        verify(mockList,atLeast(2)).add("three times");
        verify(mockList,atMost(5)).add("three times");


    }

    @Test
    public void testB(){
        List list = new LinkedList();
        List spy = spy(list);

        //optionally, you can stub out some methods:
        when(spy.size()).thenReturn(100);

        //using the spy calls *real* methods
        spy.add("zero"); //index从0开始
        spy.add("one");
        spy.add(2,"three");   //指定index


        //prints "one" - the first element of a list
        System.out.println("spy.index0: "+spy.get(0));

        System.out.println("spy.index1: "+spy.get(1));

        System.out.println("spy.index2: "+spy.get(2));


        //size() method was stubbed - 100 is printed
        System.out.println("Spy.size: "+ spy.size());

        //optionally, you can verify
        verify(spy).add("zero");
        verify(spy).add("one");
        verify(spy).add(2,"three");

    }

}

看下执行结果:

我们把验证结果修改下,看会发生什么

代码语言:javascript
复制
@Test
    public void testB(){
        List list = new LinkedList();
        List spy = spy(list);

        //optionally, you can stub out some methods:
        when(spy.size()).thenReturn(100);

        //using the spy calls *real* methods
        spy.add("zero");     //默认index从0开始
        spy.add("one");
        spy.add(2,"three");   //指定index


        //prints "one" - the first element of a list
        System.out.println("spy.index0: "+spy.get(0));

        System.out.println("spy.index1: "+spy.get(1));

        System.out.println("spy.index2: "+spy.get(2));


        //size() method was stubbed - 100 is printed
        System.out.println("Spy.size: "+ spy.size());

        //optionally, you can verify
        verify(spy).add("zero");
        verify(spy).add("one");
        verify(spy).add(2,"two");   //修改验证结果 three -> two

    }

Mockito语法相对来说还是比较简练的,学习成本并不算太高.

如果你有好的工具或者框架欢迎推荐给我, 一起学习一起进步.

总结:

测试是一门技术, 更是一门艺术. 也许你今天拥有的技术, 明天就会被淘汰. 同时需要我们开拓思维和眼界, 积极拥抱变化, 学习新知识, 新方法,新技能, 计算机领域讲究的是实践, 学习更要讲究方式方法. 学习和动手一定要结合, 光看不练,犹如看武功秘籍, 是永远成不了武功大侠的.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试工程师成长之道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
项目管理
CODING 项目管理(CODING Project Management,CODING-PM)工具包含迭代管理、需求管理、任务管理、缺陷管理、文件/wiki 等功能,适用于研发团队进行项目管理或敏捷开发实践。结合敏捷研发理念,帮助您对产品进行迭代规划,让每个迭代中的需求、任务、缺陷无障碍沟通流转, 让项目开发过程风险可控,达到可持续性快速迭代。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档