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));

【JUnit】EasyMock用法总结

使用EasyMock的总体步骤 1、生成Mock接口 IService mockService = EasyMock.createMock("name", IService.class); 如...
  • vking_wang
  • vking_wang
  • 2013年06月25日 16:52
  • 14496

有效使用Mock编写java单元测试

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

使用EasyMock扩展为Class提供Mock对象

使用EasyMock扩展为Class提供Mock对象Author:kongxx通常我么在测试一些类的时候需要依赖另外一些类或接口,而此时可能这些类或接口可能仅仅是方法签名而没有真正的实现。此时我们就可...
  • kongxx
  • kongxx
  • 2006年02月22日 21:49
  • 3706

easyMock简单入门例子 .

接口:   [java] view plaincopyprint? package com.inter;  public interface AddInter {  pu...
  • nuoshueihe
  • nuoshueihe
  • 2012年07月04日 21:52
  • 1278

EasyMock 新版本用法和实战经验总结和mock.js 使用的用法

easy-mock 新版本用法和实战经验总结,mock.js 使用的用法。
  • sai739295732
  • sai739295732
  • 2017年12月01日 18:28
  • 1108

EasyMock最佳实践

转载于:http://blog.sina.com.cn/s/blog_4b81125f0100hr57.html 关于EasyMock常见的几个问题, 这里有几点, 我做个翻译: ★EasyM...
  • wtfpewfn
  • wtfpewfn
  • 2012年03月27日 14:40
  • 494

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

在单元测试的
  • ITMAOO
  • ITMAOO
  • 2014年10月09日 17:06
  • 1119

聊聊单元测试(一)——EasyMock

一、单元测试是保证软件质量的重要方法。 单元测试是对系统中某个模块功能的验证,但我们总会遇到这样那样的问题,导致测试代码很难编写。最直接的一个原因便是强耦合关系,被测试者依赖一些不容易构造,...
  • shan9liang
  • shan9liang
  • 2014年07月11日 10:00
  • 4061

使用PowerMock和Easymock进行单元测试

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

EasyMock记录

EasyMock记录      一般我们先创建一个Mock对象,然后record(录制)这个对象的行为,接着将对象设置为replay(回放)状态,之后我们执行需要测试的业务代码并检验代码是否返...
  • chenglinhust
  • chenglinhust
  • 2016年07月06日 15:23
  • 764
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:EasyMock 单元测试过程中模拟相关类的实例
举报原因:
原因补充:

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