• mockito测试入门学习


     一、什么是mock测试,什么是mock对象?

    先来看看下面这个示例:

    从上图可以看出如果我们要对A进行测试,那么就要先把整个依赖树构建出来,也就是BCDE的实例。

    一种替代方案就是使用mocks

    从图中可以清晰的看出

    mock对象就是在调试期间用来作为真实对象的替代品。

    mock测试就是在测试过程中,对那些不容易构建的对象用一个虚拟对象来代替测试的方法就叫mock测试。

    知道什么是mock测试后,那么我们就来认识一下mock框架---Mockito

    二、什么是Mockito

    除了有一个好记的名字外,Mockito尝试用不一样的方法做mocking测试,是简单轻量级能够替代EasyMock的框架。使用简单,测试代码可读性高,丰富的文档包含在javadoc中,直接在IDE中可查看文档,实例,说明。

    Mockito.when(mockService.queryInfo(Mockito.any(QueryCod.class))).thenReturn(uInfo);
    mockService为接口;
    queryInfo是mockService接口里的方法;
    QueryCod是方法queryInfo的入参,是一个class对象;且只有一个入参。
    uInfo是方法queryInfo的执行结果,uInfo是mock的一个结果。

    Mockito.when(mockQueryFacade.queryByRoleId(Mockito.anyString(),Mockito.any(QueryContext.class))).thenReturn(QueryResult);

    mockQueryFacade是接口;
    queryByRoleId是mockQueryFacade接口里的方法;
    queryByRoleId方法有两个入参,
    QueryResult queryByRoleId(String roleId, QueryContext context);两个入参均mock。
    QueryResult为查询的结果。
    需要导入
    import static org.mockito.Mockito.*; import static org.junit.Assert.*; import java.util.Iterator; import org.junit.Test;
    mock可以模拟各种各样的对象,替代真正的对象做出希望的响应。
    使用mockito的方法:
    1、使用mock()模拟对象。
    //模拟LinkList的一个对象
    LinkedList mockdedList = mock(LinkedList.class);
    //此时条用get方法,会返回null,因为还没有对方法调用的返回值做模拟。
    System.out.printlin(mockedList.get(99));
    2、指定mock对象被调用时的返回值。
    a、模拟,方法调用的返回值。
    //模拟获取第一个元素时,返回字符串first。给特定的方法调用返回固定值,在官方说法中称stub。
    (stub,为屏蔽客户调用远程主机上的对象,必须提供某些方式来模拟本地对象,这种本地对象称为存根stub)
    when(mockedList.get(0).thenReturn("first"));
    //此时打印输出first
    System.out.println(mockedList.get(0));
    b、模拟,方法调用抛出异常
    //模拟获取第二个元素时,抛出RuntimeException
    when(mockedList.get(1)).thenThrow(new RuntimeException);
    //此时抛出RuntimeException异常
    System.out.println(mockedList.get(1));

    没有返回值类型的方法也可以模拟异常抛出:
    doThrow(new RuntimeException()).when(mockedList).clear();
    c、模拟调用方法时的参数匹配
    //anyInt()匹配任何int参数,这表示参数为任何值,均返回element
    when(mockedList.get(anyInt())).thenReturn("element");
    //此时打印是element
    System.out.println(mockedList.get(99));
    d、模拟方法调用次数
    //调用add一次
    mockedList.add("once");
    //验证add方法是否被调用了一次,两种写法效果一样
    verify(mockedList)add("once");
    verify(mockedList,times(1)).add("once");
    还可以通过atLeast(int i)和taMost(int i)来验证被调用的次数的最小值和最大值
    3、验证被测试类是否正确工作,使用verify()。

    默认情况下,对于所有的有返回值且没有stub过的地方,mockito会返回相应的默认值,
    对于内置类型会返回默认值,如int会返回0,布尔值返回false,对于其他type会返回null。
    mock对象会覆盖整个被mock的对象,因此没有stub的方法只能返回默认值。
    //重复stub两次,则以第二次为准,如下将返回”second“
    when(mockedList.get(0)).thenReturn("first");
    when(mockedList.get(0)).thenReturn("second");
    //下面这种形式表示第一次调用返回”first“,第二次调用返回”second“,可以写n多个
    when(mockedList.get(0)).thenReturn("first").thenReturn("second");
    如果实际调用次数超过了stub过的次数,则会一直返回最后一次stub的值,如上例,第三次调用get(0),则返回 ”second“

    验证方法被调用了特定的次数
    //验证add方法被调用了两次
    verify(mockedList,times(2)).add("2");
    //验证add方法致至少被调用一次
    verify(mockedList.atLeastOnce()).add("2");
    //验证add方法至少被调用两次
    verify(mockedList,atLeast(2)).add("2");
    //验证add方法最大被调用5次
    verify(mockedList,atMost(5)).add("2");
    //验证add方法从未被调用
    vreify(mockedList,never()).add("2");找到冗余的调用,使用never();
  • 相关阅读:
    再提一个建议,不过就要辛苦dudu了
    项目中的小项目实现在望
    Visual Studio.Net 技术Tip
    IQueryable与foreach的困惑?
    [转贴]浅析大型网站的架构
    [原创]WCF入门级使用教程(转载请注明出处)
    [原创]在msmq3.0中使用http协议发送消息
    [转贴][WCF Security] 4. 用户名/密码身份验证
    [转贴][WCF Security] 1. 基本概念
    [转]在SQL Server2005中进行错误捕捉
  • 原文地址:https://www.cnblogs.com/zzmb/p/7733411.html
Copyright © 2020-2023  润新知