读书人

jmock2.5根本教程

发布时间: 2012-10-26 10:30:59 作者: rapoo

jmock2.5基本教程

转载自 ---- http://zhang-xzhi-xjtu.iteye.com/blog/770438

?

jmock2.5基本教程

目录
第0章 概述
第1章 jmock初体验
第2章 期望
第3章 返回值
第4章 参数匹配
第5章 指定方法调用次数
第6章 指定执行序列
第7章 状态机

第0章 概述

现在的dev不是仅仅要写code而已,UT已经变为开发中不可缺少的一环。JUnit的出现给javaer的UT编写提供了巨大的便利。但是JUnit并没有解决所有的问题。
当我们要测试一个功能点的时候,需要把不需要我们关注的东西隔离开,从而可以只关注我们需要关注的行为。
jmock通过mock对象来模拟一个对象的行为,从而隔离开我们不关心的其他对象,使得UT的编写变得更为可行,也使得TDD变得更为方便,自然而然的,也就成为敏捷开发的一个利器。

可以到http://www.jmock.org/download.html下载jmock.
添加jar到classpath。
添加的时候,注意把JUnit4的order放到最后。因为junit4它自己带了一个Hamcrest jar。
要是不注意顺序的话,有可能报
java.lang.SecurityException: class "org.hamcrest.TypeSafeMatcher"'s signer information does not match signer information of other classes in the same package。

Note:
这里的类定义用来演示如何使用jmock,所以都是定义为public的。

    @Override??protected?void?setUpExpectatioin()?{????????final?States?states?=?context.states("sm").startsAs("s1");????????//?设置期望。??????context.checking(new?Expectations()?{??????????{??????????????//?状态为s1参数包含allen的时候返回西安??????????????allowing(addressServcie).findAddress(??????????????????????with(StringContains.containsString("allen")));??????????????when(states.is("s1"));??????????????will(returnValue(Para.Xian));????????????????//?状态为s1参数包含dandan的时候返回杭州,跳转到s2。??????????????allowing(addressServcie).findAddress(??????????????????????with(StringContains.containsString("dandan")));??????????????when(states.is("s1"));??????????????will(returnValue(Para.HangZhou));??????????????then(states.is("s2"));????????????????//?状态为s2参数包含allen的时候返回上海??????????????allowing(addressServcie).findAddress(??????????????????????with(StringContains.containsString("allen")));??????????????when(states.is("s2"));??????????????will(returnValue(Para.ShangHai));??????????}??????});??}????@Override??protected?void?invokeAndVerify()?{??????//?s1状态??????assertFindAddress("allen",?Result.Xian);??????assertFindAddress("allen0",?Result.Xian);????????//?状态跳转到?s2??????assertFindAddress("dandan",?Result.HangZhou);????????//?s2状态??????assertFindAddress("allen",?Result.ShangHai);??}??


可以看到,如果序列一样,状态也为期望的执行设置了约束,这里就是用状态来约束哪个期望应该被执行。
可以用is或者isNot来限制状态。

状态机有一个很好的用处。
当我们建立一个test执行上下文的时候,如果建立的时候和执行的时候,我们都需要调用mock ojbect的方法,那么我们可以用状态机把这两部分隔离开。让他们在不同的状态下执行。

读书人网 >编程

热点推荐