`
jomper
  • 浏览: 38194 次
  • 性别: 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...

    Python-深度学习工程模板简化加载数据构建网络训练模型和预测样本的流程

    为了简化这些复杂的过程,开发者们经常使用模板来提高效率和可复用性。本篇文章将深入探讨如何利用Python进行深度学习工程,并以"Python-深度学习工程模板简化加载数据构建网络训练模型和预测样本的流程"为主题,...

    基于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固件、日志文件、图像文件、文档文件头等。...

    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论文结构包括标题、作者...

    IET系列期刊通用模板

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

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

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

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

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

    solidworks文件模板.zip

    "solidworks文件模板.zip"提供了一组模板,这些模板简化了新设计的初始化步骤,使用户能够快速地进入设计阶段,节省了重复设置的时间。 二、模板分类 压缩包中的"solidworks文件模板"可能包括以下几类: 1. 零件...

Global site tag (gtag.js) - Google Analytics