EasyMock 单元测试过程中模拟相关类的实例

原创 2014年10月09日 17:06:04

在单元测试的过程中,我们希望仅仅测试一个类的功能是否正常,但是一个类中往往会引用其他类,而不得在测试一个类的同时其它类相关也进行了测试。 看上去结果很好,一个测试不仅测试了目标类又测试了其它类,但是这样的交叉测试导致一个致命问题,单元测试不再测试单一的类,一旦一个类出现问题会影响到多个单元测试,同样一个测试失败也不知道到底是哪个类出现问题。单元测试变成了集成测试,失去了单元测试的意义。 

因此,合理的单元测试应该是一个类写一个测试,涉及到的其他引用类怎么办? EasyMock正是为此而生,它可以模拟出一个相关类的的行为。具体来讲,一个类主要就是所拥有的方法的行为,而EasyMock可以预先设定一个方法传入什么样的参数返回什么样的值,并且可以设定在程序中调用多少次,等等。这样一来单元测试就是真正意义的“单元”测试,使得测试代码更加精准。

下面是一个简单的例子:

被测试类:

public class BaseAvailabilityService implements AvailabilityService {
	
	
	private IConvert convert;
	private IService service;
	private IProfileService profile;
	
	@Override
	public Availability getAvailability(AvailabilityCriteria criteria, Contract contract) {
		final HotelSearchCriteria hsc = (HotelSearchCriteria) criteria.getCriteria();
		final ChannelHotelMapping hotelMapping = profile.getChannelHotelMapping(contract.getChannelCode(), hsc.getUniqueHotelCode());
		
		GetAvailRS avail = service.getAvailability(hotelMapping.getChannel().getAccount(), convert.toGetAvailRQ(criteria, hotelMapping));
		return convert.toAvailability(avail, criteria.getGuestCount().getAdultCount(), hotelMapping, null);
	}
	@Required
	public void setConvert(IStarwoodConvert convert) {
		this.convert = convert;
	}

	@Required
	public void setService(IStarwoodService service) {
		this.service = service;
	}
	@Required
	public void setProfile(IProfileService profile) {
		this.profile = profile;
	}

}
测试代码:

public class AvailabilityServiceTest {
	
	private BaseAvailabilityService availService = new BaseAvailabilityService();
	private IConvert convert;
	private IService service;
	private IProfileService profile;
	@Before
	public void startup(){
		convert = EasyMock.createMock(IConvert.class);
		service = EasyMock.createMock(IService.class);
		profile = EasyMock.createMock(IProfileService.class);
		availService.setConvert(convert);
		availService.setProfile(profile);
		availService.setService(service);
	}
	@Test
	public void testGetAvailability(){
		ChannelHotelMapping mapping = new ChannelHotelMapping();
		mapping.setChannel(new Channel());
		
		AvailabilityCriteria availCriteria = new AvailabilityCriteria();
		availCriteria.setCriteria(new HotelSearchCriteria());
		availCriteria.setGuestCount(new GuestCount());
		
		GetAvailRQ getAvailRQ = new GetAvailRQ();
		
		EasyMock.expect(profile.getChannelHotelMapping(null, null)).andReturn(mapping);
		EasyMock.expect(service.getAvailability(new Account(null,null), getAvailRQ)).andReturn(new GetAvailRS());
		EasyMock.expect(convert.toAvailability(new GetAvailRS(), null,mapping, null)).andReturn(new Availability());
		EasyMock.expect(convert.toGetAvailRQ(availCriteria, mapping)).andReturn(getAvailRQ);
		EasyMock.replay(profile,service,convert);
		availService.getAvailability(availCriteria, new Contract());
		EasyMock.verify(profile,service,convert);
	}
}

以上的例子中,Mock的方法都有参数与返回值,如果是有参数没有返回值的方法, 完全不能这样模拟了,可以用一下方式, 即在模拟调用的下一行,执行expectLastCall():

mokedObject.someFunction(sameObject);
EasyMock.expectLastCall();

还有一个问题,如果是想设定一个方法无论传入任何值,都返回特定值,如何设定? 可以使用参数可以使用EasyMock.isA(SomeObject.class),只要是SomeObject的实例都将执行预设的行为,如:

mokedObject.someFunction(EasyMock.isA(Object.class));

Spring+EasyMock对Service层方法进行测试,处理@Resource属性

这次说说怎么对Service层方法进行测试,同时弄清楚怎么来处理@Resource、@Autowired属性。 通过实例来描述: 有一个Service类,如下: public...

基于mock对象和JUnit框架简化Spring Web组件单元测试

对于Java组件开发者来说,他们都盼望拥有一组能够对组件开发提供全面测试功能的好用的单元测试。一直以来,与测试独立的Java对象相比,测试传统型J2EE Web组件是一项更为困难的任务,因为Web组件...

关于iOS开发过程中单元测试的一点拙见

本人比较小白,从来没有接触过单元测试的问题。 近两天用几个小时查阅了一些单元测试有关的知识,发现大家大多数都在说怎么讲写测试用例的用处或者怎么建测试用例,但是,我一直没有找到关于什么是测试用例的文章,...

Java单元测试Junit(三)使用EasyMock扩展Junit

当我们编写单元测试的过程中,我们常常遇到应用中其他依赖模块尚未开发完成,或者该依赖的构建比较复杂的情况,例如Service层已经开发完成,DAO层却还在开发当中,但Service需要依赖DAO来进行测...

使用PowerMock和Easymock进行单元测试

Java单元测试对于开发人员质量保证至关重要,尤其当面对一团乱码的遗留代码时,没有高覆盖率的单元测试做保障,没人敢轻易对代码进行重构。然而单元测试的编写也不是一件容易的事情,除非使用TDD方式,否则编...

在Eclipse中使用Junit4.x与EasyMock进行单元测试

摘要 这篇文章简单讲解了如何在Eclipse中利用Junit 4.x和EasyMock进行单元测试。 当你阅读完这篇文章后,可以在Eclipse中使用JUnit进行单元测试。 1. 概要 ...
  • cchao
  • cchao
  • 2012年06月23日 13:34
  • 1112

用EasyMock进行单元测试:什么是EasyMoc

原文:http://www.zhlwish.com/2012/06/29/easymock-1/ 用EasyMock进行单元测试:什么是EasyMock 发: 周亮 我们都知道单元测试,也...
  • xiongmc
  • xiongmc
  • 2013年07月02日 19:31
  • 1198

EasyMock 单元测试

Java开发过程中需要使用EasyMock做单元测试,今天上手使用了一下,记录之! 开发环境: JDK7.0+MyEclipse10+EasyMock3.3.1+Win7+JUnit4 1) 接口IA...

Java单元测试进阶之如何打桩(用easymock轻松打桩)

打桩(mock)是单元测试的重要内容和难点,学好打桩的技术,做单元测试基本就没什么困难了。         mock有两种,一种是静态的,一种是动态的。静态的就是在写测试代码之前根据需要打桩的类生成...

dao层service层分别使用dbunit以及easymock进行单元测试

Java中经常对service层和dao层进行单元测试,对dao层进行测试可以使用dbunit进行测试,对service可以使用easyMock和spring-test.jar进行测试 (1)dao...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:EasyMock 单元测试过程中模拟相关类的实例
举报原因:
原因补充:

(最多只允许输入30个字)