转载:https://blog.csdn.net/dc_726/article/details/8568537

1自动生成Mock类

 

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

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

 

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

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

@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);就行了。

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

输出为:

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 测试框架来测试你的代码

    原文链接 : Unit tests with Mockito - Tutorial 译文出自 : 掘金翻译计划 译者 : edvardhua 校对者: hackerkevin, futureshine ...

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

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

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

    单元测试是开发中必不可少的一部分,是产品代码的重要保证. Junit和testNG是当前最流行的测试框架,Junit是使用最广泛的测试框架,有兴趣的话自己baidu一下. testNG基于Junit和 ...

  4. 一文让你快速上手 Mockito 单元测试框架

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

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

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

  6. mock测试框架Mockito

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

  7. 测试框架Mockito使用笔记

    Mockito,测试框架,语法简单,功能强大! 静态.私有.构造等方法测试需要配合PowerMock,PowerMock有Mockito和EasyMock两个版本,语法相同,本文只介绍Mockito. ...

  8. Java测试框架Mockito源码分析

    1.Mockito简介 测试驱动的开发(Test Driven Design, TDD)要求我们先写单元测试,再写实现代码.在写单元测试的过程中,一个很普遍的问题是,要测试的类会有很多依赖,这些依赖的 ...

  9. Mock测试框架(Mockito为例)

    在做单元测试的时候,有的时候用到的一些类,我们构造起来不是那么容易,比如HttpRequest,或者说某个Service依赖到了某个Dao,想构造service还得先构造dao,这些外部对象构造起来比 ...

随机推荐

  1. 阿里云esc云服务器IP不能访问的解决办法

    问题:阿里云服务器,专有网络,web设置完毕,在服务器中localhost能够访问,并且关闭防火墙,但是使用公网ip无法访问. 解决:找到本实例安全组,配置规则,按照要求填入80或其他端口.配置完成后 ...

  2. lodash用法系列(1),数组集合操作

    Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能. 官网:https://lodash.com/引用:<script src="//cdnjs.clou ...

  3. 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(2)

    chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...

  4. iPhone开发--正则表达式获取字符串中的内容

    缘起: 想获取字符串中指定的字符,考虑用正则表达式,遂写了如下的代码: NSString *htmlStr = @"oauth_token=1a1de4ed4fca40599c5e5cfe0 ...

  5. android多设备界面适配的利器:属性weight的妙用

    1.按比例显示控件元素 <EditText android:id="@+id/edit_message" android:layout_weight="2" ...

  6. java如何直接返回excel到客户端

    既然是web项目首先你得拿到响应才能向外部写出,你得拿到响应对象response,1.添加如下两行代码response.setContentType("application/vnd..ms ...

  7. 《Java性能优化权威指南》

    <Java性能优化权威指南> 基本信息 原书名:Java performance 原出版社: Addison-Wesley Professional 作者: (美)Charlie Hunt ...

  8. 微信二维码扫描无法下载APK文件的解决办法

  9. spring学习之@SessionAttributes

    一.@ModelAttribute 在默认情况下,ModelMap 中的属性作用域是 request 级别是,也就是说,当本次请求结束后,ModelMap 中的属性将销毁.如果希望在多个请求中共享 M ...

  10. 【google chrome 一键打开 谷歌跳转的页面+JS Replace】谷歌无法打开网页的时候,提取网页中url的部分

    经常在谷歌搜索,遇到网页无法打开,然后就停留在比如:http://www.google.com.hk/search?newwindow=1&safe=strict&site=& ...