1自动生成Mock类

在需要Mock的属性上标记@Mock注解,然后@RunWith(MockitoJUnitRunner.class)或者在setUp()方法中显示调用MockitoAnnotations.initMocks(this);生成Mock类即可。

2自动注入Mock类到被测试类

只要在被测试类上标记@InjectMocks,Mockito就会自动将标记@Mock、@Spy等注解的属性值注入到被测试类中。

[java] view plain copyprint?
  1. import static org.mockito.Mockito.when;
  2. import java.util.Collections;
  3. import java.util.List;
  4. import javax.annotation.Resource;
  5. import org.junit.Assert;
  6. import org.junit.Before;
  7. import org.junit.Test;
  8. import org.junit.runner.RunWith;
  9. import org.mockito.InjectMocks;
  10. import org.mockito.Mock;
  11. import org.mockito.MockitoAnnotations;
  12. importorg.springframework.test.context.ContextConfiguration;
  13. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  14. import com.cdai.ssi.user.dao.UserDao;
  15. import com.cdai.ssi.user.domain.UserDomain;
  16. import com.cdai.ssi.user.dto.UserDto;
  17. importcom.cdai.ssi.user.service.UserService;
  18. @RunWith(SpringJUnit4ClassRunner.class)
  19. @ContextConfiguration({"classpath:spring/spring-config.xml"})
  20. public class UserServiceTest {
  21. @InjectMocks
  22. @Resource(name= "userService")
  23. privateUserService userService;
  24. @Mock
  25. privateUserDao userDao;
  26. @Before
  27. publicvoid setUp() {
  28. MockitoAnnotations.initMocks(this);
  29. }
  30. @Test
  31. publicvoid testQueryAll() {
  32. when(userDao.selectAll()).
  33. thenReturn(Collections.<UserDomain>emptyList());
  34. List<UserDto>dtoList = userService.queryAll();
  35. Assert.assertTrue(dtoList.isEmpty());
  36. }
  37. }
import static org.mockito.Mockito.when;import java.util.Collections;
import java.util.List;import javax.annotation.Resource;import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
importorg.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.cdai.ssi.user.dao.UserDao;
import com.cdai.ssi.user.domain.UserDomain;
import com.cdai.ssi.user.dto.UserDto;
importcom.cdai.ssi.user.service.UserService;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/spring-config.xml"})
public class UserServiceTest {@InjectMocks@Resource(name= "userService")privateUserService userService;@MockprivateUserDao userDao;@Beforepublicvoid setUp() {MockitoAnnotations.initMocks(this);}@Testpublicvoid testQueryAll() {when(userDao.selectAll()).thenReturn(Collections.<UserDomain>emptyList());List<UserDto>dtoList = userService.queryAll();Assert.assertTrue(dtoList.isEmpty());}}

@InjectMocks的问题是:如果被测试类是代理类,那么注入会失效。比如上面的UserService如果是事务或者其他AOP代理类,那么进入@Test方法时UserService中的DAO属性不会被Mock类替换。

3 Mock方法定制再也不用录制、播放了

Mockito的Mock方法定制可读性很强,而且也不需要像EasyMock那样录制播放,定制后就可以使用。

例如:

when(userDao.selectAll()).

thenReturn(Collections.<UserDomain>emptyList());

4有些方法想Mock定制,有些想调用真实方法

因为@Mock针对接口生成Mock类,所以我们是没法调用到真实的实现类的方法。可以使用@Spy注解标注属性,并且标注@Resource注解让Spring注入真实实现类,那么Mockito就会自动生成Spy类。

例如:

@InjectMocks

@Resource(name ="userService")

privateUserService userService;

@Spy

@Resource

privateUserDao userDao;

Spy类就可以满足我们的要求。如果一个方法定制了返回值或者异常,那么就会按照定制的方式被调用执行;如果一个方法没被定制,那么调用的就是真实类的方法。

如果我们定制了一个方法A后,再下一个测试方法中又想调用真实方法,那么只需在方法A被调用前,调用Mockito.reset(spyObject);就行了。

[java] view plain copyprint?
  1. import static org.mockito.Mockito.when;
  2. import org.mockito.Mockito;
  3. public class TestMockObject implementsITestMock {
  4. publicstatic void main(String[] args) {
  5. ITestMockmock = Mockito.mock(TestMockObject.class);
  6. System.out.println(mock.test1());
  7. System.out.println(mock.test2());
  8. ITestMockspy = Mockito.spy(new TestMockObject());
  9. System.out.println(spy.test1());
  10. System.out.println(spy.test2());
  11. when(spy.test1()).thenReturn(100);
  12. System.out.println(spy.test1());
  13. Mockito.reset(spy);
  14. System.out.println(spy.test1());
  15. System.out.println(spy.test2());
  16. when(spy.test1()).thenReturn(104);
  17. System.out.println(spy.test1());
  18. }
  19. @Override
  20. publicint test1() {
  21. System.out.print("RealTest1()!!! - ");
  22. return1;
  23. }
  24. @Override
  25. publicint test2() {
  26. System.out.print("RealTest2()!!! - ");
  27. return2;
  28. }
  29. }
import static org.mockito.Mockito.when;import org.mockito.Mockito;public class TestMockObject implementsITestMock {publicstatic void main(String[] args) {ITestMockmock = Mockito.mock(TestMockObject.class);System.out.println(mock.test1());System.out.println(mock.test2());ITestMockspy = Mockito.spy(new TestMockObject());System.out.println(spy.test1());System.out.println(spy.test2());when(spy.test1()).thenReturn(100);System.out.println(spy.test1());Mockito.reset(spy);System.out.println(spy.test1());System.out.println(spy.test2());when(spy.test1()).thenReturn(104);System.out.println(spy.test1());}@Overridepublicint test1() {System.out.print("RealTest1()!!! - ");return1;}@Overridepublicint test2() {System.out.print("RealTest2()!!! - ");return2;}}

输出为:

0

0

Real Test1()!!! - 1

Real Test2()!!! - 2

Real Test1()!!! - 100

Real Test1()!!! - 1

Real Test2()!!! - 2

Real Test1()!!! - 104

要注意的是,对Spy对象的方法定制有时需要用另一种方法:

===============================================================================

Importantgotcha on spying real objects!

Sometimes it's impossible to usewhen(Object) for stubbing spies. Example:

List list = new LinkedList();

List spy = spy(list);

//Impossible: real method is called so spy.get(0) throwsIndexOutOfBoundsException (the list is yet empty)

when(spy.get(0)).thenReturn("foo");

//You have to use doReturn() for stubbing

doReturn("foo").when(spy).get(0);

===============================================================================

因为用when(spy.f1())会导致f1()方法被真正执行,所以就需要另一种写法。

参考资料

Mockito文档

http://mockito.googlecode.com/svn/branches/1.6/javadoc/org/mockito/Mockito.html

强大的Mockito测试框架相关推荐

  1. 使用强大的 Mockito 测试框架来测试你的代码

    这篇教程介绍了如何使用 Mockito 框架来给软件写测试用例 1. 预备知识 如果需要往下学习,你需要先理解 Junit 框架中的单元测试. 如果你不熟悉 JUnit,请查看下面的教程: http: ...

  2. 强大的Mockito测试框架(转)

    1.自动生成Mock类 在需要Mock的属性上标记@Mock注解,然后@RunWith中配置Mockito的TestRunner或者在setUp()方法中显示调用MockitoAnnotations. ...

  3. 用maven搭建 testNG+PowerMock+Mockito测试框架

    转载:http://www.cnblogs.com/changzhz/p/5158068.html 单元测试是开发中必不可少的一部分,是产品代码的重要保证. Junit和testNG是当前最流行的测试 ...

  4. mockito mock void方法_一文让你快速上手 Mockito 单元测试框架(上)

    作者|mghio 编辑|包包 前言  在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用.为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改 ...

  5. mockito mock void方法_一文让你快速上手 Mockito 单元测试框架

    前言 在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用.为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改,简化集成,方便代码重构以及许多 ...

  6. Electron桌面App测试框架Spectron VS Puppeteer

    Electron桌面App测试框架Spectron VS Puppeteer 前言 Electron Spectron 介绍 试用 试用评价 Puppeteer 介绍 试用 试用评价 总结 前言 根据 ...

  7. Mockito:一个强大的用于Java开发的模拟测试框架

    介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用Mockito的Java示例. 模拟(Mock)的概念 在软件开发的世界之外, "mock"一 ...

  8. 【Web安全】一款功能强大的Web身份认证测试框架

    关于Raider Raider是一款功能强大的Web身份认证测试框架,该框架被设计用来测试Web应用程序的身份认证机制.虽然像ZAProxy和Burpsuite这样的Web代理工具同样可以允许研究人员 ...

  9. java的mock测试框架

    无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...

  10. java contains_Java常用测试框架大全,不要只会Junit

    介绍 要做好测试驱动开发,意识习惯最重要,其次也得回编写优雅的单元测试.java测试框架很多,各种断言和注解,有点混乱,编写测试时老师搞不清该用哪个. 本文简单梳理java常用的几个测试工具:Juni ...

最新文章

  1. 妙用通配符证书发布多个安全站点
  2. Dotnet 6.0,你值得拥有
  3. ueditor如何设置上传图片的高度宽度_怎么设置天猫主图
  4. 如何看创建媒体日期_汽车各零部件也有身份证,教你们如何看这些部件的出生日期...
  5. python 并查集_python 实现并查集源代码 | 学步园
  6. ArcGIS Engine中添加点、线、面元素
  7. 黑莓手机BlackBerry Servicebook(简称SB)应用详解指南
  8. opencv设置摄像头分辨率
  9. 通达OA2017版连接sqlserver2008数据库
  10. JavaScript ES6介绍
  11. BF算法与KMP算法
  12. mysql新增一个常数列_添加常数列
  13. 平安科技表格识别——原理解读
  14. 启动Nginx时报错:error while loading shared libraries: librdkafka.so.1: cannot open shared object file: No
  15. 如何编程阶梯形c语言,阶梯式C语言程序设计实验指导书.doc
  16. python批量读取文件内容_Python从数据库读取大量数据批量写入文件的方法
  17. 搞线上渠道推广实操这么些年了
  18. 2018互联网月饼哪家强?阿里有情怀、腾讯最实在、咪咕最暖萌、联想最简单粗暴......
  19. CoffeeScript入门实践
  20. Axure 8.1.0.3381激活码 亲测可用

热门文章

  1. javafx实现读者文摘上的文章预览及下载
  2. jenkins插件管理提示“update information obtained:不可用ago”
  3. Kafka学习笔记之Kafka三款监控工具
  4. Java 使用BigDecimal类处理高精度计算
  5. JAVA-面向对象-多态
  6. 队列实现max操作,要求尽量提高效率。
  7. ASP.NET MVC 分部视图
  8. *最近培训的一个题目:蚂蚁爬竿
  9. ubuntu之路——day9.2 Covariate shift问题和Batch Norm的解决方案
  10. 如何实现 迭代器 可迭代对象 (2.1)