一、什么是mock测试,什么是mock对象?
先来看看下面这个示例:
从上图可以看出如果我们要对A进行测试,那么就要先把整个依赖树构建出来,也就是BCDE的实例。
一种替代方案就是使用mocks
从图中可以清晰的看出
mock对象就是在调试期间用来作为真实对象的替代品。
mock测试就是在测试过程中,对那些不容易构建的对象用一个虚拟对象来代替测试的方法就叫mock测试。
知道什么是mock测试后,那么我们就来认识一下mock框架---Mockito
二、什么是Mockito
除了有一个好记的名字外,Mockito尝试用不一样的方法做mocking测试,是简单轻量级能够替代EasyMock的框架。使用简单,测试代码可读性高,丰富的文档包含在javadoc中,直接在IDE中可查看文档,实例,说明。更多信息:http://code.google.com/p/mockito/
三、Stub和Mock
相同点:Stub和Mock对象都是用来模拟外部依赖,使我们能控制。
不同点:而stub完全是模拟一个外部依赖,用来提供测试时所需要的测试数据。而mock对象用来判断测试是否能通过,也就是用来验证测试中依赖对象间的交互能否达到预期。在mocking框架中mock对象可以同时作为stub和mock对象使用,两者并没有严格区别。 更多信息:http://martinfowler.com/articles/mocksArentStubs.html
四、mockito入门实例
Maven依赖:(没用maven管理的可以下载相关jar包导入classpath)
- <dependencies>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-all</artifactId>
- <version>1.8.5</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- import static org.mockito.Mockito.*;
- import java.util.List;
- import org.junit.Assert;
- import org.junit.Test;
- /**
- *
- * @author lzjun
- * @version 0.1
- * @date 2012-5-5
- * {@link http://weibo.com/u/1697702241}
- *
- */
- public class SimpleTest {
- @Test
- public void simpleTest(){
- //创建mock对象,参数可以是类,也可以是接口
- List<String> list = mock(List.class);
- //设置方法的预期返回值
- when(list.get(0)).thenReturn("helloworld");
- String result = list.get(0);
- //验证方法调用(是否调用了get(0))
- verify(list).get(0);
- //junit测试
- Assert.assertEquals("helloworld", result);
- }
- }
好了,五分钟差不多了,还想继续了解那就可以往下面看
创建mock对象不能对final,Anonymous ,primitive类进行mock。
可对方法设定返回异常
- when(list.get(1)).thenThrow(new RuntimeException("test excpetion"));
stubbing另一种语法(设置预期值的方法),可读性不如前者
- doReturn("secondhello").when(list).get(1);
没有返回值的void方法与其设定(支持迭代风格,第一次调用donothing,第二次dothrow抛出runtime异常)
- doNothing().doThrow(new RuntimeException("void exception")).when(list).clear();
- list.clear();
- list.clear();
- verify(list,times(2)).clear();
五、参数匹配器(Argument Matcher)
Matchers类内加你有很多参数匹配器 anyInt、anyString、anyMap.....Mockito类继承于Matchers,Stubbing时使用内建参数匹配器,下例:
- @Test
- public void argumentMatcherTest(){
- List<String> list = mock(List.class);
- when(list.get(anyInt())).thenReturn("hello","world");
- String result = list.get(0)+list.get(1);
- verify(list,times(2)).get(anyInt());
- Assert.assertEquals("helloworld", result);
- }
需要注意的是:如果使用参数匹配器,那么所有的参数都要使用参数匹配器,不管是stubbing还是verify的时候都一样。
- @Test
- public void argumentMatcherTest2(){
- Map<Integer,String> map = mock(Map.class);
- when(map.put(anyInt(),anyString())).thenReturn("hello");//anyString()替换成"hello"就会报错
- map.put(1, "world");
- verify(map).put(eq(1), eq("world")); //eq("world")替换成"world"也会报错
- }
六、方法调用的验证(具体的调用次数、至少一次,一次也没有)
- @Test
- public void verifyInvocate(){
- List<String> mockedList = mock(List.class);
- //using mock
- mockedList.add("once");
- mockedList.add("twice");
- mockedList.add("twice");
- mockedList.add("three times");
- mockedList.add("three times");
- mockedList.add("three times");
- /**
- * 基本的验证方法
- * verify方法验证mock对象是否有没有调用mockedList.add("once")方法
- * 不关心其是否有返回值,如果没有调用测试失败。
- */
- verify(mockedList).add("once");
- verify(mockedList, times(1)).add("once");//默认调用一次,times(1)可以省略
- verify(mockedList, times(2)).add("twice");
- verify(mockedList, times(3)).add("three times");
- //never()等同于time(0),一次也没有调用
- verify(mockedList, times(0)).add("never happened");
- //atLeastOnece/atLeast()/atMost()
- verify(mockedList, atLeastOnce()).add("three times");
- verify(mockedList, atLeast(2)).add("twice");
- verify(mockedList, atMost(5)).add("three times");
- }
一次写不完,慢慢分析。。。
参考:
http://mockito.googlecode.com/svn/branches/1.6/javadoc/org/mockito/Mockito.html
http://www.sizovpoint.com/2009/03/java-mock-frameworks-comparison.html
http://wenku.baidu.com/view/8def451a227916888486d73f.html
http://qiuguo0205.iteye.com/blog/1443344
转:http://liuzhijun.iteye.com/blog/1512780
http://blog.csdn.net/sdyy321/article/details/38757135/
http://www.tuicool.com/articles/uYBFja
相关推荐
**Python BDD 框架入门** 行为驱动开发(Behavior-Driven ...通过这个简单的入门指南,你应该对Python的BDD框架有了初步的认识。接下来,你可以尝试在自己的项目中应用这些知识,进一步提升你的测试自动化能力。
- **AutoResponder选项卡**:可以设置规则,当请求匹配特定URL时,Fiddler将返回预设的响应数据,实现简单的Mock功能。 通过以上介绍,我们可以看到Fiddler在各种测试和开发场景中的强大应用。无论是为了调试API...
安全性分析编码标准化类型检查on-代码质量指标测验pytest-单元和集成测试pytest-mock-简单,孤立的嘲笑pytest-cov-测试代码覆盖率tox-针对多个版本的Python测试CI管道GitHub动作特拉维斯CI 用法make setup-pre-...
- **如何猴子补丁(monkeypatch)和模拟(mock)模块及环境**:猴子补丁允许在测试中替换模块或对象的行为,而 mock 可以模拟依赖项,以便隔离测试。 - **如何运行 doctests**:Pytest 可以识别并执行 Python 模块...
Rails提供了一整套完善的测试框架,包括单元测试、集成测试等,支持Mock对象,使得编写和执行测试变得更加简单高效。 ##### 3.5 支持敏捷开发 Rails的设计初衷就是为了支持敏捷开发方法论,它允许团队快速响应需求...
通过`README.md`和`how-to-write-a-phpunit-testcase-master`这两个文件,你可以找到更详细的指导和示例代码,进一步熟悉phpunit的使用。不断实践和编写测试用例,将使你更加熟练地掌握phpunit,提升你的PHP开发技能...
"Hello World"是编程界的传统入门示例,通常用于展示一种新语言的基本用法。在这个描述中,它似乎被用来表示这是作者第一次向GitHub推送项目,显示了作者的学习或探索过程。 在Python的世界里,测试是保证代码质量...
1. Introduction to Zend Framework 1.1. 概述 1.2. 安装 2. Zend_Acl 2.1. 简介 2.1.1. 关于资源(Resource) 2.1.2. 关于角色(Role) 2.1.3. 创建访问控制列表(ACL) 2.1.4. 注册角色(Role) 2.1.5. 定义访问...
** Jest 测试框架入门指南** 在现代Web开发中,单元测试和集成测试是确保代码质量、稳定性和可维护性的重要工具。Jest是一款流行的JavaScript测试框架,尤其在React社区中广泛应用。它以其丰富的功能集、易用性和...