`
jomper
  • 浏览: 38336 次
  • 性别: Icon_minigender_1
  • 来自: 湖北-武汉
社区版块
存档分类
最新评论

用模板简化EasyMockTest

    博客分类:
  • Java
阅读更多
mock template
/**
 * mock template
 * @author Jomper
 *
 */
public abstract class MockTemplate {
	private Object[] mocks;

	@Before
	public void setUp() throws Exception{
		mockFields(getClass(), this);
		expectAll();
	}

	@Test
	public void test() {
		replay(mocks);
		process();
		verify(mocks);
	}

	/**
	 * reflect itself get annotate fields that dynamic assigned to mock objects
	 * @param clazz
	 * @param test
	 * @throws Exception
	 */
	private void mockFields(Class<?> clazz, Object test) throws Exception {
		List<Object> _mocks = new ArrayList<Object>();
		for (Field field : clazz.getDeclaredFields()) {
			if (field.getAnnotation(Mock.class) != null) {
				try {
					field.setAccessible(true);
					Object o = createMock(field.getType());
					field.set(test, o);
					_mocks.add(o);
				} catch (IllegalArgumentException e) {
					throw new Exception(e.getMessage(),e);
				}
			}
		}
		mocks = _mocks.toArray();
	}

	public abstract void process();

	public abstract void expectAll();
}


测试模型:
/**
 * Response interface
 * @author Jomper
 *
 */
public interface Response {
	/**
	 * request handler
	 * @param request
	 * @return result
	 */
	public Object getResult(Request request);
}

/**
 * Request interface
 * @author Jomper
 *
 */
public interface Request {
	/**
	 * set request content
	 * @param o
	 */
	public void setRequest(Object o);
}

/**
 * Service sample
 * @author Jomper
 * 
 */
public class Service {
	/**
	 * you can do something before get result
	 * initial response result and filter special characters from request content
	 * @param request
	 * @param response
	 * @return
	 */
	public Object execute(Request request, Response response) {
		//TODO something before get result
		return response.getResult(request);
	}
}


测试实例
/**
 * service test
 * @author Jomper
 *
 */
public class ServiceTest extends MockTemplate {
	@Mock private Request request;
	@Mock private Response response;
	private Service service;
	
	@Before
	public void before() throws Exception{
		service = new Service();
	}

	public void expectAll() throws Exception{
		request.setRequest("a cup of tea");
		request.setRequest("coffee");
		expect(response.getResult(request)).andReturn("Sorry").andReturn("OK");
	}

	/**
	 * if request.setRequest("a cup of tea"),response.getResult(request) return "Sorry"
	 * else return "OK"
	 */
	public void process() throws Exception{
		request.setRequest("a cup of tea");
		assertTrue("Sorry".equals(service.execute(request, response)));
		
		request.setRequest("coffee");
		assertTrue("OK".equals(service.execute(request, response)));
	}
}


这个是受了ajoo帖子的启发

分享到:
评论
13 楼 zdonking 2008-02-05  
恩。这个expectAll设计的有问题,如果只是在基类里只是暴露个的expect方法,方便test使用就可以了。
12 楼 ajoo 2008-02-03  
zdonking 写道
不在test里 显式的expect,replay,感觉别扭。可能是习惯了正常方式。

主要是,难道一个test class只能有一个expectation?只能有一个test case?
11 楼 joachimz 2008-02-03  
粗看一眼,与fest mock比较象!
http://fest.easytesting.org/
10 楼 zdonking 2008-02-03  
不在test里 显式的expect,replay,感觉别扭。可能是习惯了正常方式。
9 楼 jomper 2008-02-02  
精雕细凿了一下.
8 楼 ajoo 2008-02-01  
jomper 写道
太刻薄了. - -!

不是刻薄吧?程序风格问题有不同意见很正常吧?要是这你也觉得刻薄,还是别让人review代码了。
7 楼 jomper 2008-02-01  
太刻薄了. - -!
6 楼 ajoo 2008-02-01  
jomper 写道
ajoo 写道
要是我,肯定把@Mock写在同一行里:

@Mock Foo foo;

多占一行明显看着不舒服。

幸亏不是你review 我工作的代码...

呵呵。也幸亏我不用看这个代码。感觉会很痛苦地。
5 楼 jomper 2008-01-31  
ajoo 写道
要是我,肯定把@Mock写在同一行里:

@Mock Foo foo;

多占一行明显看着不舒服。

幸亏不是你review 我工作的代码...
4 楼 ajoo 2008-01-31  
要是我,肯定把@Mock写在同一行里:

@Mock Foo foo;

多占一行明显看着不舒服。
3 楼 jomper 2008-01-31  
改动了一下,已经和ajoo的很相似了...。
2 楼 jomper 2008-01-31  
用了 @Mock以后的确 代码更简洁了。

完全把不相干的东西剥离出去了。

太棒了!
1 楼 ajoo 2008-01-31  
脚着比俺的@Mock难用多了。

相关推荐

    PHP模板简化网站设计的研究.pdf

    通过使用模板技术,可以简化网站设计和维护工作,提高网站的响应速度和维护效率。 知识点: 1. 传统网站设计的缺点:设计过程长且不能并行工作,网页布局和网页内容没有分离。 2. 模板的定义和功能:模板是一种...

    苹果cms海螺主题模板简化版安装教程.txt

    苹果cms海螺主题模板简化版安装教程

    苹果cms海螺主题模板简化版安装教程

    说明( 这次直接简化起来 直接下载cms源码+模板主题导入即可) 第一步:下载好苹果CMS源码 第二步:下载模板主题 导入根目录 第三步:登录网站后台—–自定义菜单配置里面添加:海螺主题设置,/admin....

    nodestream, 通过模板简化实时应用.zip

    nodestream, 通过模板简化实时应用 NodestreamNodestream目的是通过将事件侦听器连接到模板呈现,以便实现实时web应用程序的最常用用例。示例用例考虑下面的例子,用表达式。 以下两个路由分别显示和保存项目app.get...

    hfs-zh_hans_hfs登录模板_HFS模板_hfs默认模板_hfs配置模板_hfs_

    总结起来,HFS的汉化模板对于中文用户来说具有显著的实用价值,它提升了用户界面的友好度,简化了配置过程,使得非英文熟练的用户也能自如地管理和分享文件。无论是初学者还是经验丰富的用户,都应该充分利用这些...

    基于Python的PyTeX LaTeX模板简化编写设计源码

    该项目是一款基于Python的PyTeX LaTeX模板编写工具,旨在简化LaTeX文档的编写过程。该项目包含86个文件,主要包括71个Python源码文件、10个Markdown文件、1个YAML配置文件、1个许可证文件、1个LaTeX类文件、1个参考...

    Winhex模板大全新收集winhex实用模板 winhex Template

    模板系统是Winhex的一个强大特性,它简化了复杂数据的解析和分析过程。例如,其中包括了101项常见的WinHex模板,这些模板涵盖了各种常见的数据格式,如硬盘SMART信息、BIOS固件、日志文件、图像文件、文档文件头等。...

    IET期刊投稿模板+latex模板

    )这个NJDv5 LaTeX模板的创建是为了(1)提供适当的指导来简化过程,(2)模拟文章发表后的大致外观,(3)减少将提交的LaTeX手稿转换为期刊最终出版规范的生产过程中的时间和人工干预。模板是基于标准文章的。CLS类文件,...

    jsp模板 jsp模板 jsp模板jsp模板jsp模板

    jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp模板jsp...

    Access模板Access模板Access模板(30个)

    总之,这30个Access模板不仅提供了即插即用的数据库解决方案,同时也是一份宝贵的学习资料,让用户能够深入理解和掌握Access的各种功能,从而提升数据库管理技能。无论是初学者还是经验丰富的用户,都能从中受益。在...

    Zabbix 模板 H3C交换机通用模板

    在Zabbix中,模板是预定义的一组配置项,用于简化设备监控的设置过程。"Zabbix 模板 H3C交换机通用模板"就是为H3C(Huawei 3Com)交换机设计的一种模板,目的是方便快速地配置Zabbix以监控这些交换机的关键指标。 H...

    网页模板 模板 首页模板 后台模板 网站

    使用这些模板,开发者可以快速搭建起一个美观且功能完善的网站。在实际应用中,开发者可能会根据项目需求对模板进行调整,添加自定义功能,或者替换特定部分以满足特定品牌或设计规范。 总结来说,网页模板是现代...

    基于Java的Android简化版空壳模板设计源码

    该项目提供一款基于Java的Android简化版空壳模板源码,包含57个文件,涵盖14个XML布局文件、14个Java类文件、10个PNG图片资源、6个Gradle构建脚本、2个Git忽略配置文件、2个属性配置文件、1个YAML文件以及必要的其他...

    IEEE access模板、论文模板

    4. **在线LaTeX编辑器**:如Overleaf,提供了一个实时协作和预览的平台,用户可以在网页上直接编写LaTeX代码,无需安装任何软件,大大简化了LaTeX的使用过程。 5. **论文结构**:典型的IEEE论文结构包括标题、作者...

    Notes模板,适合于notes初学者!

    * 简化数据库管理:使用模板可以简化数据库的管理,管理员可以更方便地管理和维护数据库。 Lotus Notes 6 附带的模板 Lotus Notes 6 附带了许多实用的模板,以下是一些常见的模板: * ALOG4.NTF:代理日志模板 ...

    餐饮购物小票模板.docx

    通过使用这样的模板,商家可以轻松定制自己的小票,提高工作效率,提升品牌形象,同时确保交易记录的准确性和完整性。在实际操作中,用户只需将具体的信息填入模板,即可快速生成专业的小票,大大简化了日常工作流程...

    IET系列期刊通用模板

    本文将详细介绍这个模板的组成部分及其使用方法,尤其适合初次接触学术写作的小白。 首先,IET系列期刊通用模板包含了以下几个关键部分: 1. **作者简介**:这是展示作者背景和研究领域的地方,通常包括作者姓名、...

    试卷模板 试卷模板 试卷模板 试卷模板 试卷模板

    这样的模板通常包含各种题型(如选择题、填空题、简答题等)、分数分配、版面设计以及必要的说明部分,旨在简化教师或管理员的工作流程,提高效率。 在描述中提到的"试卷模板很好用",这意味着模板具备以下特点: 1...

    microsoft office 2003 自带ppt模板

    然而,一些简化版或定制安装可能并未包含这些模板,这给需要使用模板的用户带来了困扰。因此,从完整版中提取出的PPT模板就显得尤为珍贵,它提供了丰富的设计选择,能够满足用户的多样化需求。 在提供的压缩包文件...

    ASP.NET 模板引擎 jntemplate C#模板引擎,可以多模板切换

    ASP.NET 模板引擎,如jntemplate,是.NET开发者常用的一种工具,它极大地简化了网页和各种文本生成的工作流程。这种模板引擎的核心思想是将显示逻辑与业务逻辑分离,使得设计人员和开发人员可以各自独立地进行工作,...

Global site tag (gtag.js) - Google Analytics