• 单元测试——隔离神器:mockito


    mockito,一个让人着迷的单元测试隔离框架。对比了easymock,jmock,jmockito,最终选择了它。

    为什么用他

    1. 接口语法简洁、自然。写起来像在说话,很舒服。
    2. 文档更完整。让学习曲线更简单。
    3. 可以进行参数化。在很多情况下,不想关心具体的参数是什么。
    4. mock的思路更舒服。废弃了陈旧的“录制——重放”的方法,使用的“期望——执行——断言”更自然的方法。

    他能解决什么问题

    1. 可以mock接口。
    2. 可以破除不可控制的依赖。主要体现在:数据库、文件系统、http(特别是在和第三方接口对接时)等。
    3. 模拟异常。

    使用场景

    mock接口

    Comparable c = mock(Comparable.class);
    when(c.compareTo("Test")).thenReturn(1);
    
    assertEquals(1, c.compareTo("Test"));
    

    不关注参数

    Comparable c = mock(Comparable.class);
    //一旦使用anyXxx()系列,所有的方法参数都必须`全部`使用anyXxx()。
    when(c.compareTo(anyString())).thenReturn(1);
    
    assertEquals(1, c.compareTo("Test"));
    

    破除不可控制的依赖

    HttpServletRequest successRequest =mock(HttpServletRequest.class);
    when(successRequest.getAttribute("status")).thenReturn("200");
    
    OrderEntity order = finish(successRequest);
    
    assertTrue(order.isOk());
    

    模拟异常

    OutputStream osMock = mock(OutputStream.class);
    OutputStreamWriter osw = new OutputStreamWriter(osMock);
    /*
     * 因为close()方法的返回值是void,所以只能用这只格式
     * 如果返回值不是void,也可以使用when(someMethod()).thenThrow(new Exception());
     */
    doThrow(IOException.class).when(osMock).close();
    
    osw.close();
    

    更简洁的mock

    通过注解Mock

    @Mock
    private Iterator i;
    
    @BeforeClass
    public void init() {
    	//这个是必须的。
    	MockitoAnnotations.initMocks(this);
    }
    
    @Test
    public void annotationMock() {
    	when(i.next()).thenReturn(1);
    
    	assertEquals(1, i.next());
    }
    

    限制

    对于final类、匿名类和Java的基本类型是无法进行mock。不过可以使用powerMock扩展。但是正常情况下是不需要的,除非对历史代码的单元测试

    参考资源

    1. 官方文档
    2. 中文文档
    3. 快速上手
  • 相关阅读:
    Pass360[最新].cpp
    在任意的远程桌面的session中运行指定的程序
    C++内存泄露的检测(三)
    在release模式下debug
    [转]VC Studio 使用技巧大全
    C++内存泄露的检测(一)
    获取系统用户所对应的配置路径
    关于Debug和Release之本质区别的讨论
    GDB 的使用
    struct termios
  • 原文地址:https://www.cnblogs.com/ansn001/p/4939518.html
Copyright © 2020-2023  润新知