文档章节

5分钟了解Mockito

闪电
 闪电
发布于 2016/09/25 12:52
字数 1036
阅读 78
收藏 3

一、什么是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)

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>1.9.5</version>
    <scope>test</scope>
</dependency>

 

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/

闪电
粉丝 75
博文 392
码字总数 6789
作品 0
海淀
技术主管
私信 提问
Stream.parallel()学习小计

今天想了解一下parallel的工作原理,于是看了一个网上的demo,用parallel来实现一个1+2+3+..+n-1+n的操作,因为parallel背后是使用的jdk7才引入的ForkJoinPool,而ForkJoinPool默认会启动=处...

虾几把写
2018/03/19
38
0
Prometheus Operator - 每天5分钟玩转 Docker 容器技术(177)

前面我们介绍了 Kubernetes 的两种监控方案 Weave Scope 和 Heapster,它们主要的监控对象是 Node 和 Pod。这些数据对 Kubernetes 运维人员是必须的,但还不够。我们通常还希望监控集群本身的...

cloudman6
2018/06/05
0
0
Python大牛的必学成长之路(20个经典学习资料)

想要成为Python大师,首先要从最基础知识开始学起,了解掌握Python最基础的知识点,编程意识从无都有,才能在Python 的道路上走得更远。 第一章 python基础 3课时 1小时5分钟 1、python 入门...

让往事随风
2015/12/23
53
0
调整Kali Linux的锁屏时间

调整Kali Linux的锁屏时间 锁屏是保护隐私的一种重要机制。当用户不操作电脑一段时间后,系统会进入锁屏状态。用户需要输入口令,才能重新进入系统。避免因为操作人员离开电脑后,被其他人员...

大学霸
2016/12/21
115
0
Spring、Spring Boot 和 TestNG 测试指南 ( 4 )

原文出处:chanjarster Mock测试技术能够避免你为了测试一个方法,却需要自行构建整个依赖关系的工作,并且能够让你专注于当前被测试对象的逻辑,而不是其依赖的其他对象的逻辑。 举例来说,...

chanjarster
2017/12/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

川普给埃尔多安和内堪尼亚胡的信

任性 https://twitter.com/netanyahu/status/1186647558401253377 https://edition.cnn.com/2019/10/16/politics/trump-erdogan-letter/index.htm...

Iridium
11分钟前
5
0
golang-mysql-原生

db.go package mainimport ("database/sql""time"_ "github.com/go-sql-driver/mysql")var (db *sql.DBdsn = "root:123456@tcp(127.0.0.1:3306)/test?charset=u......

李琼涛
40分钟前
4
0
编程作业20191021092341

1编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时 间。使用#define或const创建一个表示60的符号常量或const变量。通过while 循环让用户重复输入值,直到用户输入小于或等于0的值...

1李嘉焘1
40分钟前
6
0
Netty整合Protobuffer

现在我们都知道,rpc的三要素:IO模型,线程模型,然后就是数据交互模型,即我们说的序列化和反序列化,现在我们来看一下压缩比率最大的二进制序列化方式——Protobuffer,而且该方式是可以跨...

算法之名
45分钟前
18
0
如何用C++实现栈

栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压...

BWH_Steven
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部