`
xitongyunwei
  • 浏览: 925145 次
文章分类
社区版块
存档分类
最新评论

强大的Mockito测试框架

 
阅读更多

1自动生成Mock类


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

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


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

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;
        
         @Mock
         privateUserDao userDao;
 
         @Before
         publicvoid setUp() {
                   MockitoAnnotations.initMocks(this);
         }
        
         @Test
         publicvoid 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);就行了。

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());
         }
 
         @Override
         publicint test1() {
                   System.out.print("RealTest1()!!! - ");
                   return1;
         }
 
         @Override
         publicint 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


分享到:
评论

相关推荐

    spring集成TestNG与Mockito框架单元测试方法.pdf

    spring集成TestNG与Mockito框架单元测试方法,方便学习者能快速上手如何单测,对自己的代码能够有质量保证。

    spring集成TestNG与Mockito框架单元测试方法

    spring集成TestNG与Mockito框架单元测试方法

    Mockito+Junit5测试方法实践

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

    模拟测试框架Mockito简明教程

    Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 JDBC 中的ResultSet 对象),用一个虚拟的对象(Mock 对象)来创建...

    mockito单元测试使用

    记得以前面试的时候,面试官问我,...我们常使用的就是 Junit 框架,说到测试,我之前一直没搞清楚,直到现在才有点头绪,不知道你们会不会遇到这种问题,在测试中若是涉及到 find 方法还好,但是涉及到修改数据的操作

    Java测试框架Mockito的简明教程

    主要介绍了Java测试框架Mockito的简明教程,Mock 测试是单元测试的重要方法之一。本文介绍了基于 Java 语言的 Mock 测试框架 – Mockito 的使用。,需要的朋友可以参考下

    高效组合测试框架Jukito.zip

    JUnit、 Guice、 Mockito 高效组合测试框架。如果你使用 Google Guice,或者如果你的GWT应用程序使用 Gin,那么,Jukito 是解决你的单元测试头痛的灵丹妙药。现在,你可进行如下测试:@RunWith(JukitoRunner.class...

    编程语言+JAVAspring+测试框架+单元测试

    编程语言+JAVAspring+测试...它介绍了JAVAspring的测试框架的概念、原理和作用,以及如何使用JAVAspring的测试框架来进行单元测试,包括JUnit、TestNG、Mockito、Spring Test等内容,以及一些配置文件和注解的用法。

    Spring Boot单元测试中使用mockito框架mock掉整个RedisTemplate的示例

    今天小编就为大家分享一篇关于Spring Boot单元测试中使用mockito框架mock掉整个RedisTemplate的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    mockito源码 供java同学学习,用于在自动化单元测试中创建测试对象,为TDD或BDD提供支持

    Mockito是一个为Java开发的强大的模拟测试框架。其主要功能是创建和配置Mock对象,以简化存在外部依赖的类的测试。通过使用Mockito,我们可以虚拟出一个外部依赖,这样可以降低测试组件之间的耦合度,使得我们能更...

    Mockito:用 Java 编写的最流行的单元测试模拟框架-开源

    可以从 Central Repository 和 Bintray ... Mockito 是一个很好用的模拟框架。 它让您可以使用干净简单的 API 编写漂亮的测试。 Mockito 不会让您感到宿醉,因为这些测试非常具有可读性,并且会产生干净的验证错误。

    JUnitGuiceMockito高效组合测试框架

    JUnit、 Guice、 Mockito 高效组合测试框架。 如果你使用 Google Guice,或者如果你的GWT应用程序使用 Gin,那么,Jukito 是解决你的单元测试头痛的灵丹妙药。

    mockito-all-1.10.17

    mockito-all-1.10.17单元测试框架

    单元测试模拟框架PowerMock.zip

    PowerMock 也是一个单元测试模拟框架,它是在其它单元测试模拟框架的基础上做出的扩展。通过提供定制的类加载器以及一些字节码篡改技巧的应用,PowerMock 现了对静态方法、构造方法、私有方法以及 Final 方法的模拟...

    mockito-doc-zh:Mockito框架中文文档

    Mockito框架官方地址,。 Mockito库能够Mock对象、验证结果以及打桩(stubbing)。 该文档您也可以通过获取到。所有文档都保存在javadocs中,因为它能够保证文档与源代码的一致性。这样也能够让离线的用户从IDE直接...

    单元测试框架深入与分享

    单元测试框架深入与分享

    Mockito一个采用Java编写用于单元测试的Mocking框架

    Mockito是一个针对Java的mocking框架。它与EasyMock和jMock很相似,但是通过在执行后校验什么已经被调用,它消除了对期望行为(expectations)的需要。其它的mocking库需要你在执行前记录期望行为(expectations),...

    TestFramowrks:JUnit & Mockito 框架使用示例

    测试框架JUnit & Mockito 框架使用示例。

    Android代码-Android中必要的一环—单元测试

    Android单元测试(二):Mockito框架的使用 Android单元测试(三):PowerMock框架的使用 Android单元测试(四):Robolectric框架的使用 Android单元测试(五):网络接口测试 Android单元测试(六):RxJava测试 ...

    Mockito:用 Java 编写的最流行的单元测试 Mocking 框架-开源

    可以从 Central Repository 和 Bintray ... Mockito 是一个很好用的模拟框架。 它让您可以使用干净简单的 API 编写漂亮的测试。 Mockito 不会让您感到宿醉,因为这些测试非常具有可读性,并且会产生干净的验证错误。

Global site tag (gtag.js) - Google Analytics