zoukankan      html  css  js  c++  java
  • 测试框架Mockito使用笔记

    Mockito,测试框架,语法简单,功能强大!
    静态、私有、构造等方法测试需要配合PowerMock,PowerMock有Mockito和EasyMock两个版本,语法相同,本文只介绍Mockito.

    测试对像:ArticleManager

    ArticleManager 类

    public class ArticleManager {
        void setDatabase(ArticleDatabase database) {... }
        String get(String val){
            database.get(val);    
        }
        String add(String val){
            database.set(val);    
        }
    }
    

    ArticleDatabase 类

    public class ArticleDatabase {
        String get(String val){...}
        String add(String val){...}
    }
    

    注解

    @Mock

    创建Mock对像

    @Mock
    private ArticleDatabase ds;
    

    实例ds是一个虚拟对像,ds对像本身的所有方法返回值都为Null。

    @InjectMocks

    @InjectMocks
    private ArticleManager articleManager;
    

    将现有Mock对像(ds)注入到articleManager,支持方法包括constructor, setter, property 和 Spring的@Autowired !

    @Captor

    参数调用截取器

    //定义@Captor,如果要获取多个参数, 需要定义多个@Captor
    @Captor
    private ArgumentCaptor<String> argumentString;
    articleManager.add("content");
    verify(ds, times(1)).add(argumentString.capture());
    //打印参数值
    logger.debug(argumentString.getValue());
    

    @Spy

    Mock类的部分真实或定制后调用。没有定制的方法就调用真实的方法。

    @Spy 
    private ArticleManager articleManager2;
    //定制方法,这个地方用`when`还会调用真实的方法后返回定制结果
    //见:http://docs.mockito.googlecode.com/hg/latest/org/mockito/Spy.html
    doReturn("0").when(articleManager2).get(0);
    articleManager2.get(0);
    verify(articleManager2).get(0);
    //调用真实的方法
    articleManager2.get(1)
    verify(articleManager2).get(1);
    

    @Spy真实调用也可以用@Mock对像thenCallRealMethod方法调用:

    when(articleManager2.get(2)).thenCallRealMethod();
    

    Stubbing

    特别制定Mock对像某方法的返回值、类型或异常等,默认是Null,

    when(ds.get(0)).thenReturn("first");
    when(ds.get(1)).thenThrow(new RuntimeException());
    

    verify

    对某方法返回结果的校验,包括调用次数,返回值等

    articleManager.add("one");
    verify(ds).add("one");
    

    参考:@Captor

    模糊匹配

    在Stubbing或verify里可用模糊匹配来适配多种情况的调用,Mockito在包org.mockito.Matchers下提供有anyString(), anyInt()或者直接anyObject()等大量模糊匹配函数,如果有需要还可自己写,实现(org.hamcrest.Matcher)。 例:

    when(articleManager.get(anyString())).toReturn("element");
    System.out.println(articleManager.get("1"));
    verify(articleManager).get(anyString());
    

    在使用校验函数verify时,参数如果有模糊匹配则所有参数都要用模糊匹配,如:

    //正确的写法:
    verify(mock).articleManager(anyInt(), anyString(), eq("third argument"));
    //错误用法:
    verify(mock).articleManager(anyInt(), anyString(), "third argument");
    

    更多模糊匹配函数请参考:http://mockito.googlecode.com/svn/branches/1.8.5/javadoc/org/mockito/Matchers.html

    参考地址:

    mockito home
    mockito docs

  • 相关阅读:
    机器学习踩坑之Win10+Ubuntu双系统安装踩坑经验
    面向对象
    模块(三)
    模块(二)
    模块之日志
    包的基础使用
    模块介绍
    递归
    匿名函数与三元表达式
    生成器与迭代器
  • 原文地址:https://www.cnblogs.com/xguo/p/3261924.html
Copyright © 2011-2022 走看看