`
jomper
  • 浏览: 38023 次
  • 性别: 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难用多了。

相关推荐

    课程报告模板 简化.docx

    电子制图报告模板简化.docx 通过分析提供的文件信息,我们可以总结出以下知识点: 1. 电子制图报告的组成部分:电子制图报告通常包括电路图各部分原理分析、图纸绘制过程、绘图能力的收获与体会等部分。 2. 电路...

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

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

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

    ### 苹果CMS海螺主题模板简化版安装教程 #### 安装背景与意义 苹果CMS是一款非常流行的视频网站管理系统,被广泛应用于搭建在线视频播放平台。海螺主题作为其一款美观且实用的主题模板,受到了许多用户的青睐。...

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

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

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

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

    Ajax天气预报案例(使用模板引擎渲染).zip

    这个项目以"Ajax天气预报案例(使用模板引擎渲染).zip"为标题,提供了从基础到实践的教程,适用于初学者快速上手了解Ajax和模板引擎的运用。 首先,我们要理解Ajax的核心概念。Ajax(Asynchronous JavaScript and ...

    基于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...

    Zabbix 模板 H3C交换机通用模板

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

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

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

    线程模板类(c++),简化线程创建。

    以前经常用VC编程的时候写的一个线程模板类 可以以类的任何方法作为线程过程启动 之后作为了简化 约定方法必须无返回值 且无参数 thread h总共30多行代码 下载者可随意修改 复制 希望对大家有用 用法示例: #...

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

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

    IEEE access模板、论文模板

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

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

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

    网站模板,网站模板,网站模板

    总的来说,网站模板极大地简化了网站开发过程,让不具备深厚技术背景的用户也能快速创建出美观、功能丰富的网站。通过理解模板的工作原理和如何利用提供的压缩包文件,我们可以更高效地利用这些资源,为自己的网站...

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

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

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

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

    solidworks文件模板.zip

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

    130套thinkphp5网站模板源码,企业网站建设thinkphp模板,建站thinkphp源码模板网站搭建

    模板引擎是ThinkPHP5中的重要组成部分,它允许开发者使用简单的语法编写视图层代码,将数据和HTML分离。这些130套模板源码涵盖了各种类型的企业网站需求,包括但不限于:企业简介、产品展示、新闻资讯、案例展示、...

Global site tag (gtag.js) - Google Analytics