当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

强大的Mockito测试框架

发表于: 2013-12-10   作者:bijian1013   来源:转载   浏览:
摘要: 一.自动生成Mock类        在需要Mock的属性上标记@Mock注解,然后@RunWith中配置Mockito的TestRunner或者在setUp()方法中显示调用MockitoAnnotations.initMocks(this);生成Mock类即可。二.自动注入Mock类到被测试类  &nbs

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

二.自动注入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类替换。

 

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

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

例如:

@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

强大的Mockito测试框架

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
上一次,向大家介绍了Openqa.org社区提供的、适合web应用的、开源的自动化测试框架 (开源测试工具/
上一次,向大家介绍了Openqa.org社区提供的、适合web应用的、开源的自动化测试框架 (开源测试工具/
准备 本文需要Java和Junit基础,可参考:使用Junit进行单元测试教程,Java程序设计简介。 项目地址
强大的前端框架模版分享(含Zip) 我不会CSS 由于想做一个私站,一开始还天真的想自己手写Css打造UI
打造轻量级自动化测试框架WebZ 一、什么是WebZ   WebZ是我用Python写的“关键字驱动”的自动化测
为什么需要Mock 测试驱动的开发(Test Driven Design, TDD)要求我们先写单元测试,再写实现代码。在
我不会CSS 由于想做一个私站,一开始还天真的想自己手写Css打造UI。不料,自己连个定位都写不出来!
本文主要是分享了5个常用的Java分布式缓存框架,这些缓存框架支持多台服务器的缓存读写功能,可以让
talent-validate是一个广泛使用的js验证框架,目前已经有很多朋友在用了,而我本人所带的所有项目都
事务管理是企业级应用程序开发中必不可少的技术, 用来确保数据的完整性和一致性. 事务就是一系列的
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号