现在java mock测试框架有哪些框架

总体上来说,jMock 是一个轻量级的模拟对象技术的实现。它具有以下特点:
1.可以用简单易行的方法定义模拟对象,无需破坏本来的代码结构表;
2.可以定义对象之间的交互,从而增强测试的稳定性;
3.可以集成到测试框架;
4.易扩充;
我们首先必须引入 jMock 的类,定义我们的测试类,创建一个 Mockery 的对象用来代表上下文。上下文可以模拟出对象和对象的输出,并且还可以检测应用是否合法。
@SuppressWarnings("unchecked")
public&class&BookListTest&{
&&&&private&final&Mockery&context&=&new&JUnit4Mockery()&{
&&&&&&&&&&&&//&声明针对类进行mock,针对接口则会采用动态代理,不需要声明
&&&&&&&&&&&&setImposteriser(ClassImposteriser.INSTANCE);
context 对象便可以用来创建Mock对象。
接下来的例子,我们模拟一个ServiceCall对象,我们以它的Map call(String target, Map dataMap)为例,针对此方法,设定预期值。然后我们在执行用例的时候调用此方法,便可以得到预期值。
"unchecked")
public&class&BookListTest&{
&&&&private&final&Mockery&context&=&new&JUnit4Mockery()&{
&&&&&&&&&&&&setImposteriser(ClassImposteriser.INSTANCE);
&&&&@Test
&&&&public&void&testExecuteNormal()&throws&Exception&{
&&&&&&&&final&ServiceCall&sCall&=&context.mock(ServiceCall.class);
&&&&&&&&context.checking(new&Expectations()&{
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&one(sCall).call(JMockService.queryDtlInfo,&null);
&&&&&&&&&&&&&&&&//&构建预期结果
&&&&&&&&&&&&&&&&Map&ret&=&new&HashMap();
&&&&&&&&&&&&&&&&ret.put("OrderId",&"<span style="color: #");
&&&&&&&&&&&&&&&&ret.put("Data",&new&ArrayList());
&&&&&&&&&&&&&&&&//&设定预期值
&&&&&&&&&&&&&&&&will(returnValue(ret));
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&//&第二次被调用时,返回null
&&&&&&&&&&&&&&&&one(sCall).call(JMockService.queryDtlInfo,&new&HashMap());
&&&&&&&&&&&&&&&&will(returnValue(null));
&&&&&&&&&&&&}
&&&&&&&&});
&&&&&&&&BookList&bListAction&=&new&BookList();
&&&&&&&&bListAction.setName("jnbzwm");
&&&&&&&&//&设定ServiceCall对象为Mock对象
&&&&&&&&bListAction.setServiceCall(sCall);
&&&&&&&&//&执行Action方法
&&&&&&&&bListAction.execute();
&&&&&&&&Assert.assertEquals("<span style="color: #",&bListAction.getOrderId());
&&&&&&&&Assert.assertEquals(<span style="color: #,&bListAction.getDataList().size());
校验expectations中的规则
使用jMock时,一般会通过如下代码指定expectations:
private&final&Mockery&context&=&new&JUnit4Mockery()&{
&&&&&&&&&&&&setImposteriser(ClassImposteriser.INSTANCE);
&&&&&#64;Test
&&&&public&void&testExecuteNormal()&throws&Exception&{
&&&&&&&&final&ServiceCall&sCall&=&context.mock(ServiceCall.class);
&&&&&&&&context.checking(new&Expectations()&{
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&one(sCall).call(JMockService.queryDtlInfo,&null);
&&&&&&&&&&&&&&&&//&构建预期结果
&&&&&&&&&&&&&&&&Map&ret&=&new&HashMap();
&&&&&&&&&&&&&&&&ret.put("OrderId",&"<span style="color: #");
&&&&&&&&&&&&&&&&ret.put("Data",&new&ArrayList());
&&&&&&&&&&&&&&&&//&设定预期值
&&&&&&&&&&&&&&&&will(returnValue(ret));
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&//&第二次被调用时,返回null
&&&&&&&&&&&&&&&&one(sCall).call(JMockService.queryDtlInfo,&new&HashMap());
&&&&&&&&&&&&&&&&will(returnValue(null));
&&&&&&&&&&&&}
&&&&&&&&});
为了校验expectations中的规则是否都满足,可以在测试完成后通过增加 context.assertIsSatisfied()方法来验证expectations是否满足。
&&&&&#64;Test
&&&&public&void&testExecuteNormal()&throws&Exception&{
&&&&&&&&final&ServiceCall&sCall&=&context.mock(ServiceCall.class);
&&&&&&&&context.checking(new&Expectations()&{
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&one(sCall).call(JMockService.queryDtlInfo,&null);
&&&&&&&&&&&&&&&&//&构建预期结果
&&&&&&&&&&&&&&&&Map&ret&=&new&HashMap();
&&&&&&&&&&&&&&&&ret.put("OrderId",&"<span style="color: #");
&&&&&&&&&&&&&&&&ret.put("Data",&new&ArrayList());
&&&&&&&&&&&&&&&&//&设定预期值
&&&&&&&&&&&&&&&&will(returnValue(ret));
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&//&第二次被调用时,返回null
&&&&&&&&&&&&&&&&one(sCall).call(JMockService.queryDtlInfo,&new&HashMap());
&&&&&&&&&&&&&&&&will(returnValue(null));
&&&&&&&&&&&&}
&&&&&&&&});
&&&&&&&&BookList&bListAction&=&new&BookList();
&&&&&&&&bListAction.setName("jnbzwm");
&&&&&&&&//&设定ServiceCall对象为Mock对象
&&&&&&&&bListAction.setUpfServiceCall(sCall);
&&&&&&&&//&执行Action方法
&&&&&&&&bListAction.execute();
&&&&&&&&Assert.assertEquals("<span style="color: #",&bListAction.getOrderId());
&&&&&&&&Assert.assertEquals(<span style="color: #,&bListAction.getDataList().size());
&&&&&&&&context.assertIsSatisfied();&
由于我定义了两条规则,而第二条并未调用,所以此用例不会通过。
有两种方法,第一种就是直接通过多次调用 will(returnValue(X))来指定。如:
&&&&&#64;Test
&&&&public&void&testExecuteNormal()&throws&Exception&{
&&&&&&&&final&ServiceCall&sCall&=&context.mock(ServiceCall.class);
&&&&&&&&context.checking(new&Expectations()&{
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&one(sCall).call(JMockService.queryDtlInfo,&null);
&&&&&&&&&&&&&&&&will(returnValue(<span style="color: #));
&&&&&&&&&&&&&&&&//&第二次被调用时,返回1
&&&&&&&&&&&&&&&&one(sCall).call(JMockService.queryDtlInfo,&null);
&&&&&&&&&&&&&&&&will(returnValue(<span style="color: #));
&&&&&&&&&&&&&&&&//&第三次被调用时,返回2
&&&&&&&&&&&&&&&&one(sCall).call(JMockService.queryDtlInfo,&null);
&&&&&&&&&&&&&&&&will(returnValue(<span style="color: #));
&&&&&&&&&&&&}
&&&&&&&&});
然而第一种方法会增加维护成本,且缺乏可控性。jMock提供了第二种方法,即通过onConsecutiveCalls的action来实现返回不同的返回值。如:
&&&&&#64;Test
&&&&public&void&testExecuteNormal()&throws&Exception&{
&&&&&&&&final&ServiceCall&sCall&=&context.mock(ServiceCall.class);
&&&&&&&&context.checking(new&Expectations()&{
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&atLeast(<span style="color: #).of&(sCall).call(JMockService.queryDtlInfo,&null);
&&&&&&&&&&&&&&&&will(onConsecutiveCalls(&returnValue(<span style="color: #),&&returnValue(<span style="color: #),&&returnValue(<span style="color: #)));&
&&&&&&&&&&&&}
&&&&&&&&});
在will方法中直接使用throwException的action。参考如下语法:
one(sCall).call(JMockService.queryDtlInfo, null);
// 设定预期值,抛出异常
will(throwException(new BusinessException("~", "name can't empty.")));
结合测试异常一起使用,代码如下:
&&&&&#64;Test(expected=BusinessException.class)
&&&&public&void&testExecuteNormal()&throws&Exception&{
&&&&&&&&final&ServiceCall&sCall&=&context.mock(ServiceCall.class);
&&&&&&&&context.checking(new&Expectations()&{
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&one(sCall).call(JMockService.queryDtlInfo,&null);
&&&&&&&&&&&&&&&&//&构建预期结果
&&&&&&&&&&&&&&&&Map&ret&=&new&HashMap();
&&&&&&&&&&&&&&&&ret.put("OrderId",&"<span style="color: #");
&&&&&&&&&&&&&&&&ret.put("Data",&new&ArrayList());
&&&&&&&&&&&&&&&&//&设定预期值
&&&&&&&&&&&&&&&&will(throwException(new&BusinessException("~",&"name&can't&empty.")));
&&&&&&&&&&&&&&&&//&第二次被调用时,返回null
&&&&&&&&&&&&&&&&one(sCall).call(JMockService.queryDtlInfo,&new&HashMap());
&&&&&&&&&&&&&&&&will(returnValue(null));
&&&&&&&&&&&&}
&&&&&&&&});
&&&&&&&&BookList&bListAction&=&new&BookList();
&&&&&&&&bListAction.setName("");
&&&&&&&&//&设定ServiceCall对象为Mock对象
&&&&&&&&bListAction.setUpfServiceCall(sCall);
&&&&&&&&//&执行Action方法
&&&&&&&&bListAction.execute();
看得迷迷糊糊的&&&&
&re: JUnit单元测试Mock技术之jMock用法介绍
&#64;Nike Air Jordan
怎么迷糊了?&&&&
&re: JUnit单元测试Mock技术之jMock用法介绍
JMockService是啥?&&&&&&国之画&&&& &&
版权所有 京ICP备号-2
迷上了代码!为什么 JMockit 相比其他 Java Mock 框架,好像资料很少_百度知道目前 java支持rest风格 使用最广泛的开源框架是什么?
最好附上资料或用法
需要与delphi交互,请说的详细些,谢谢。
回复讨论(解决方案)
与&delphi&交互的项目&我目前正在做&楼主可以给我发站内信息&
java开源比较流行的技术就是&spring&nbsp
-16:10&&&[]
本博文为子墨原创,转载请注明出处!
JPinyin是一个汉字转拼音的Java开源类库,在PinYin4j的功能基础上做了一些改进。【JPinyin主要特性】1、准确、完善的字库;Unicode编码从4E00-9FA5范围及3007(〇)的20903个汉字中,JPinyin能
17:30&&&[]
我现在用spring&mvc&加上portlet组件&做的一个项目,现在要求我把之前的写好的一个对文件加密的方法改成&rest风格的接口,供别人调用&&,项目里边的框架都搭好了,不用再配置其它任何东西了,应该是只改方法就行.下面是我的方法
20:05&&&[]
现在在JAVA上主流的3D开发平台是什么?支持OPENGL吗?哪个版本的JAVA支持OPENGL?
还是需要安装一个第三方的软件,才能支持OPENGL?
我现在用的是VS2005&VC++,它自带的有OPENGL。
回复讨论(解决方案)
Java的主攻方向不是这个。还是继续
-12:44&&&[]
最新版的libiconv 1.14目前还不支持64位系统,只能编译出32位库。 libiconv 1.14下载地址: http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
libiconv介绍: http://www.gnu.org
01:28&&&[]
怎样写一个框架。我看到开源项目的框架都是一个或者几个jar。
那么该怎样生成jar呢?
以及开发一个框架需要注意什么地方?
要用到什么技术?
大家来讨论一下
回复讨论(解决方案)
菜鸟围观中,等待高手解惑
先谈点小应用实现吧
妈呀,真NB啊
关注!我现在
13:38&&&[]
Framework&
这 是一个让你只需用Java与XHTML技术就能够开发交互式Web站点的开源框架。它目的就是开发出一个简单,支持WYSIWYG页面编辑而不需要编写 Java代码或在JSP页中使用特殊标签的框架。开发基于Java的Web应用程序通常是使用MVC设计模式和JSP技术
14:07&&&[]
& 有关java各种框架的基础设计,笔者经验之谈,算是小结吧!:)
一, Hibernate 部分
1,简述hibernate映射继承关系和映射组成关系有何异同?
映射继承关系:类和类之间除了关联和聚集关系外,还可以有继承关系。什么时候需要映射继承关系呢,举个例 --子,一个公司里面
17:02&&&[]
& 有关java各种框架的基础设计,笔者经验之谈,算是小结吧!:)
一, Hibernate 部分
1,简述hibernate映射继承关系和映射组成关系有何异同?
映射继承关系:类和类之间除了关联和聚集关系外,还可以有继承关系。什么时候需要映射继承关系呢,举个例 --子,一个
18:30&&&[]
得,大部分是内部资料,涉及商业秘密,不宜透露&
但主体还是解决压力问题,使用集群和缓存&
指导思想是:分而治之&
其实我也想知道,呵呵
一般IBM都会有自己的一套框架结构,不才用开源!
广告一下,&程序员&杂志第11期有一篇
20:03&&&[]
基于C/S结构的,什么语言的UI界面做的效果最好
回复讨论(解决方案)
我觉得UI关键是图片做得好不好啊.....
flash也不错
WPF,相当的华丽,虽说win8时代是说html5+js可能取代它,不过暂时来说,微软不会这么做的
虽然我是搞java
-14:45&&&[]
;/TextBlock&
使用集合语法给属性赋值,起码得有个属性啊,就像ListBox的Item属性一样。
TextBlock这种写法,是由TextBlock的什么属性支持的?
回复讨论(解决方案)
有人知道吗???
TextBlock&t&=&nbsp
-16:46&&&[]jMockit java单元测试 使用jMockit mock静态类 - 为程序员服务
为程序员服务
java单元测试 使用jMockit mock静态类
使用jmockit做java的单元测试mock静态类,可以通过 Mockit.setUpMock(ServiceFactory.class, ServiceFactoryStub.class);直接指定静态类方法的替代类即可,如下是示例:
要mock的类
public class ServiceFactory {
public static String getAService() {
return &real service&;
package cn.outofmemory.junit.
import mockit.M
import mockit.M
import static org.junit.Assert.assertE
import org.junit.T
public class ServiceFactoryTest {
public void should_return_mock_service() {
Mockit.setUpMock(ServiceFactory.class, ServiceFactoryStub.class);
assertEquals(&mock service&, ServiceFactory.getAService());
private static class ServiceFactoryStub {
public static String getAService() {
return &mock service&;
您可能的代码
相关聚客文章
荣誉:2076
相关专栏文章

我要回帖

更多关于 mock框架比较 的文章

 

随机推荐