1. 为什么使用Mock?
- 依赖外部服务
- TDD 部分依赖未实现
- 测试实现分离
- 单元测试的思路就是我们想在不涉及依赖关系的情况下测试代码。这种测试可以让你无视代码的依赖关系去测试代码的有效性。
2. mock优点
-
提前创建测试; TDD(测试驱动开发)
-
团队可以并行工作
提供文档后,测试人员即可写测试用例
-
你可以创建一个验证或者演示程序。
在进行可行性分析时,创建系统原型,为 决定项目接下来是否要进行,提供了有力的基础,但最重要的还是提供了实际的设计决策。
-
为无法访问的资源编写测试
防火墙、需要认证才能访问的外部服务,使用mock替代
-
Mock 可以分发给用户
在有些情况下,某种原因你需要允许一些外部来源访问你的测试系统,像合作伙伴或者客户。这些原因导致别人也可以访问你的敏感信息,而你或许只是想允许访问部分测试环境。
-
隔离系统
在没有系统其他部分的影响下测试系统单独的一部分。由于其他系统部分会给测试数据造成干扰,影响根据数据收集得到的测试结论。使用mock你可以移除掉除了需要测试部分的系统依赖的模拟。
3. 常用Mock框架比较
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行为
7. 常用Api
- mock方法
创建代理对象,对象的返回值为对应类型的默认值
-
doAnswer, 处理返回值
-
verify 校验