`
lantian_123
  • 浏览: 1360216 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

5分钟了解Mockito

 
阅读更多

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

 

  • 大小: 30.6 KB
  • 大小: 27.6 KB
8
0
分享到:
评论
5 楼 zc-111 2016-03-30  
看完了才发现这篇文章果然是你写的
4 楼 SilenceGG 2015-03-16  
看完了,才发现时部长写的,真爱啊
3 楼 syx278250658 2014-11-18  
写的不错,入门杠杆的
2 楼 lantian_123 2014-09-03  
A289048093 写道
不错,看完了才发现这篇文章竟然是你写的

说得好像你认识我似的?
1 楼 A289048093 2014-09-02  
不错,看完了才发现这篇文章竟然是你写的

相关推荐

    Mockito+Junit5测试方法实践

    内容概要:参考Mockito官方API文档,实践框架每个特性。 适合人群:Mockito入门人员以及想全面...能学到什么:“Mockito 4.6.0 + Junit 5”的组合编程。 使用建议:使用前安装好Maven及Java即可,推荐使用VSCode编辑。

    mockito-core-4.0.0-API文档-中文版.zip

    赠送jar包:mockito-core-4.0.0.jar; 赠送原API文档:mockito-core-4.0.0-javadoc.jar; 赠送源代码:mockito-core-4.0.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-4.0.0.pom; 包含翻译后的API文档:...

    mockito-core-4.0.0-API文档-中英对照版.zip

    赠送jar包:mockito-core-4.0.0.jar; 赠送原API文档:mockito-core-4.0.0-javadoc.jar; 赠送源代码:mockito-core-4.0.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-4.0.0.pom; 包含翻译后的API文档:...

    mockito-jar.zip

    mockito-all-1.10.19.jar mockito-core-4.5.1.jar mockito-junit-jupiter-4.5.1.jar mockito-junit-jupiter-4.5.1-sources.jar

    Mockito for spring

    Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito for spring Mockito ...

    mockito-1.9.5.zip

    mockito junit 单元测试 mockito junit 单元测试

    mockito-1.9.0.zip

    mockito-1.9.0.zip,免费下载,需要的拿去

    mockito-core-2.15.0-API文档-中文版.zip

    赠送jar包:mockito-core-2.15.0.jar; 赠送原API文档:mockito-core-2.15.0-javadoc.jar; 赠送源代码:mockito-core-2.15.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-2.15.0.pom; 包含翻译后的API文档...

    Mockito-Programming-Cookbook

    Mockito is an open source testing framework for Java released under the MIT License. The framework allows the creation of test double objects (mock objects) in automated unit tests for the purpose of ...

    mockito-core-3.8.0-API文档-中文版.zip

    赠送jar包:mockito-core-3.8.0.jar; 赠送原API文档:mockito-core-3.8.0-javadoc.jar; 赠送源代码:mockito-core-3.8.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-3.8.0.pom; 包含翻译后的API文档:...

    mockito-core-3.8.0-API文档-中英对照版.zip

    赠送jar包:mockito-core-3.8.0.jar; 赠送原API文档:mockito-core-3.8.0-javadoc.jar; 赠送源代码:mockito-core-3.8.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-3.8.0.pom; 包含翻译后的API文档:...

    概述 Mockito

    关 于 Mockito 的 概 述

    mockito-core-3.12.2.jar

    mockito-core-3.12.2

    Junit4.12+mockito

    资源含有Junit4.12.jar和mockito的jar包以及mockito的文档

    mockito-core-3.1.0-API文档-中英对照版.zip

    赠送jar包:mockito-core-3.1.0.jar; 赠送原API文档:mockito-core-3.1.0-javadoc.jar; 赠送源代码:mockito-core-3.1.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-3.1.0.pom; 包含翻译后的API文档:...

    mockito-core-3.9.0-API文档-中文版.zip

    赠送jar包:mockito-core-3.9.0.jar; 赠送原API文档:mockito-core-3.9.0-javadoc.jar; 赠送源代码:mockito-core-3.9.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-3.9.0.pom; 包含翻译后的API文档:...

    powermock-api-mockito2-2.0.9-API文档-中英对照版.zip

    赠送jar包:powermock-api-mockito2-2.0.9.jar; 赠送原API文档:powermock-api-mockito2-2.0.9-javadoc.jar; 赠送源代码:powermock-api-mockito2-2.0.9-sources.jar; 赠送Maven依赖信息文件:powermock-api-...

    mockito-core-3.6.0.jar

    mockito-core-3.6.0.jarmockito-core-3.6.0.jar

    mockito-core-2.15.0-API文档-中英对照版.zip

    赠送jar包:mockito-core-2.15.0.jar; 赠送原API文档:mockito-core-2.15.0-javadoc.jar; 赠送源代码:mockito-core-2.15.0-sources.jar; 赠送Maven依赖信息文件:mockito-core-2.15.0.pom; 包含翻译后的API文档...

    mockito-all-1.7.jar

    mockito-all-1.7

Global site tag (gtag.js) - Google Analytics