• 测试框架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

  • 相关阅读:
    .Net下的MSMQ(微软消息队列)的同步异步调用
    [收藏]JS获取网页中HTML元素的几种方法分析
    在FireFox下设为首页的解决方法
    如何创建和使用Web Service代理类
    [收藏]61条面向对象设计的经验原则
    [总结]DotNet中用到的加密算法总结
    如何把用SQL语句int型整数转换成二进制数
    彻底杜绝PHP的session,cookie,Cannot modify header错误
    MSN总是报80048820的错误,网上搜的一些资料解决不了,我找到了真正解决办法!
    [收藏]MD5加密的javascript实现
  • 原文地址:https://www.cnblogs.com/xguo/p/3261924.html
Copyright © 2020-2023  润新知