mockito

1. 为什么使用Mock?

  • 依赖外部服务
  • TDD 部分依赖未实现
  • 测试实现分离
  • 单元测试的思路就是我们想在不涉及依赖关系的情况下测试代码。这种测试可以让你无视代码的依赖关系去测试代码的有效性。

2. mock优点

  • 提前创建测试; TDD(测试驱动开发)

  • 团队可以并行工作

    提供文档后,测试人员即可写测试用例
    
  • 你可以创建一个验证或者演示程序。

    在进行可行性分析时,创建系统原型,为 决定项目接下来是否要进行,提供了有力的基础,但最重要的还是提供了实际的设计决策。 
    
  • 为无法访问的资源编写测试

    防火墙、需要认证才能访问的外部服务,使用mock替代
    
  • Mock 可以分发给用户

    在有些情况下,某种原因你需要允许一些外部来源访问你的测试系统,像合作伙伴或者客户。这些原因导致别人也可以访问你的敏感信息,而你或许只是想允许访问部分测试环境。
    
  • 隔离系统
    在没有系统其他部分的影响下测试系统单独的一部分。由于其他系统部分会给测试数据造成干扰,影响根据数据收集得到的测试结论。使用mock你可以移除掉除了需要测试部分的系统依赖的模拟。

3. 常用Mock框架比较

mock framework

4. 为什么使用Mockito?

相比Api 简单,更加面向对象

5. 简单示例

//given
List<String> mockedList = Mockito.mock(List.class);
//when
// 设置mock对象的行为 - 当调用其get方法获取第0个元素时,返回"one"
Mockito.when(mockedList.get(anyInt())).thenReturn("one").thenReturn("cc");

// 使用mock对象 - 会返回前面设置好的值"one",即便列表实际上是空的
String str = mockedList.get(0);

Assert.assertTrue("one".equals(str));
Assert.assertTrue(mockedList.size() == 0);

// 验证mock对象的get方法被调用过,而且调用时传的参数是0
Mockito.verify(mockedList,Mockito.atMost(2)).get(anyInt());

Mockito.doReturn("ccc").when(mockedList).get(1);
//then
Assert.assertTrue("ccc".equals(mockedList.get(1)));

6. 自己实现例子模拟mockito行为

mymockito

7. 常用Api

  • mock方法

创建代理对象,对象的返回值为对应类型的默认值

  • doAnswer, 处理返回值

  • verify 校验

posted @ 2017-05-02 11:30  dragonfei  阅读(496)  评论(0编辑  收藏  举报