java mock工具类(mock测试工具哪个不是java语言)

网友投稿 282 2023-04-22


本篇文章给大家谈谈java mock工具类,以及mock测试工具哪个不是java语言对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享java mock工具类的知识,其中也会对mock测试工具哪个不是java语言进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

mock java 干什么用的

在单元测试中,经常需要进行一些mock操作。现在已经有了一些比较不错的框架在做这些事情,比如:EasyMck,他在大多数情况下运行良好,但是对于某些结构的设计却显得无能为力。
EasyMock等众多的mock框架仅能mock一些public,non static or final的方法,在大多数情况下这并没有什么问题,他可以处理大多数的问题,但是当测试的代码包含了一些静态方法。
Cactus是一个基于JUnit框架的简单测试框架,用来单元测试服务端Java代码。Cactus框架的主要目标是能够单元测试服务端的使用Servlet对象的Java方法如HttpServletRequest,
都是单元测试的框架。例如你写了一个程序 在功能测试也就是整体测试前 想知道它的对错就可以借用这些工具写个单元测试案例 单独测试这个类 或者某部分程序对错

如何对Java单例模式进行mock

JAVA单例模式的几种实现方法饿汉式单例类packagepattern.singleton;//饿汉式单例类.在类初始化时java mock工具类,已经自行实例化publicclassSingleton1{//私有的默认构造子privateSingleton1(){}//已经自行实例化privatestaticfinalSingleton1single=newSingleton1();//静态工厂方法publicstaticSingleton1getInstance(){returnsingle;}}2.懒汉式单例类packagepattern.singleton;//懒汉式单例类.在第一次调用的时候实例化publicclassSingleton2{//私有的默认构造子privateSingleton2(){}//注意java mock工具类,这里没有finalprivatestaticSingleton2single;//只实例化一次static{single=newSingleton2();}//静态工厂方法publicsynchronizedstaticSingleton2getInstance(){if(single==null){single=newSingleton2();}returnsingle;}}在上面给出懒汉式单例类实现里对静态工厂方法使用了同步化,以处理多线程环境。有些设计师在这里建议使用所谓的"双重检查成例".必须指出的是,"双重检查成例"不可以在Java语言中使用。不十分熟悉的读者,可以看看后面给出的小节。同样,由于构造子是私有的,因此,此类不能被继承。饿汉式单例类在自己被加载时就将自己实例化。即便加载器是静态的,在饿汉式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲,这个比懒汉式单例类稍差些。从速度和反应时间角度来讲,则比懒汉式单例类稍好些。然而,懒汉式单例类在实例化时,必须处理好在多个线程同时首次引用此类时的访问限制问题,特别是当单例类作为资源控制器,在实例化时必然涉及资源初始化,而资源初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变得较大。饿汉式单例类可以在Java语言内实现,但不易在C++内实现,因为静态初始化在C++里没有固定的顺序,因而静态的m_instance变量的初始化与类的加载顺序没有保证,可能会出问题。这就是为什么GoF在提出单例类的概念时,举的例子是懒汉式的。他们的书影响之大,以致Java语言中单例类的例子也大多是懒汉式的。实际上,本书认为饿汉式单例类更符合Java语言本身的特点。3.登记式单例类.packagepattern.singleton;importjava.util.HashMap;importjava.util.Map;//登记式单例类.//类似Spring里面的方法,将类名注册,下次从里面直接获取。publicclassSingleton3{privatestaticMapmap=newHashMap();static{Singleton3single=newSingleton3();map.put(single.getClass().getName(),single);}//保护的默认构造子protectedSingleton3(){}//静态工厂方法,返还此类惟一的实例publicstaticSingleton3getInstance(Stringname){if(name==null){name=Singleton3.class.getName();System.out.println("name==null"+"---name="+name);}if(map.get(name)==null){try{map.put(name,(Singleton3)Class.forName(name).newInstance());}catch(InstantiationExceptione){e.printStackTrace();}catch(IllegalAccessExceptione){e.printStackTrace();}catch(ClassNotFoundExceptione){e.printStackTrace();}}returnmap.get(name);}//一个示意性的商业方法publicStringabout(){return"Hello,IamRegSingleton.";}publicstaticvoidmain(String[]args){Singleton3single3=Singleton3.getInstance(null);System.out.println(single3.about());}}

使用MOCK对象进行单元测试

出了什么问题?      单元测试的目标是一次只验证一个方法 小步的前进 细粒度的测试 但是假如某个方法依赖于其他一些难以操控的东东 比如说网络连接 数据库连接 或者是Servlet容器 那么我们该怎么办呢?      要是你的测试依赖于系统的其他部分 甚至是系统的多个其他部分呢?在这种情况下 倘若不小心 你最终可能会发现自己几乎初始化了系统的每个组件 而这只是为了给一个测试创造足够的运行环境让它们可以运行起来 忙乎了大半天 看上去我们好像有点违背了测试的初衷了 这样不仅仅消耗时间 还给测试过程引入了大量的耦合因素 比如说 可能有人兴致冲冲地改变了一个接口或者数据库的一张表 突然 你那卑微的单元测试的神秘的挂掉了 在这种情况发生几次之后 即使是最有耐心的开发者也会泄气 甚至最终放弃所有的测试 那样的话后果就不能想像了    再让我们看一个更加具体的情况 在实际的面向对象软件设计中 我们经常会碰到这样的情况 我们在对现实对象进行构建之后 对象之间是通过一系列的接口来实现 这在面向对象设计里是最自然不过的事情了 但是随着软件测试需求的发展 这会产生一些小问题 举个例子 用户A现在拿到一个用户B提供的接口 他根据这个接口实现了自己的需求 但是用户A编译自己的代码后 想简单模拟测试一下 怎么办呢?这点也是很现实的一个问题 我们是否可以针对这个接口来简单实现一个代理类 来测试模拟 期望代码生成自己的结果呢?      幸运的是 有一种测试模式可以帮助我们 mock对象 Mock对象也就是真实对象在调试期的替代品

现在需要Mock对象吗?      关于什么时候需要Mock对象 Tim Mackinnon给我们了一些建议          真实对象具有不可确定的行为(产生不可预测的结果 如股票的行情)        真实对象很难被创建(比如具体的web容器)        真实对象的某些行为很难触发(比如网络错误)         真实情况令程序的运行速度很慢         真实对象有用户界面        测试需要询问真实对象它是如何被调用的(比如测试可能需要验证某个回调函数是否被调用了)        真实对象实际上并不存在(当需要和其他开发小组 或者新的硬件系统打交道的时候 这是一个普遍的问题) 如何实现Mock对象?      使用mock对象进行测试的时候 我们总共需要 个步骤 分别是        使用一个接口来描述这个对象       为产品代码实现这个接口       以测试为目的 在mock对象中实现这个接口      在此我们又一次看到了针对接口编程的重要性了 因为被测试的代码只会通过接口来引用对象 所以它完全可以不知道它引用的究竟是真实的对象还是mock对象 下面看一个实际的例子 一个闹钟根据时间来进行提醒服务 如果过了下午 点钟就播放音频文件提醒大家下班了 如果我们要利用真实的对象来测试的话就只能苦苦等到下午五点 然后把耳朵放在音箱旁 我们可不想这么笨 我们应该利用mock对象来进行测试 这样我们就可以模拟控制时间了 而不用苦苦等待时钟转到下午 点钟了 下面是代码

public interface Environmental {    private boolean playedWav = false;    public long getTime();    public void playWavFile(String fileName);    public boolean wavWasPlayed();    public void resetWav();    }

真实的实现代码

public class SystemEnvironment implements Environmental {    public long getTime() {    return System currentTimeMillis();          }    public void playWavFile(String fileName) {             playedWav = true;          }    public boolean wavWasPlayed() {    return playedWav;          }    public void resetWav() {             playedWav = false;          }    }

下面是mock对象

public class MockSystemEnvironment implements Environmental {    private long currentTime;    public long getTime() {    return currentTime;          }    public void setTime(long currentTime) {    this currentTime = currentTime;          }    public void playWavFile(String fileName) {             playedWav = true;          }    public boolean wavWasPlayed() {    return playedWav;          }    public void resetWav() {             playedWav = false;          }    }

下面是一个调用getTime的具体类

import java util Calendar;     public class Checker {    private Environmental env;    public Checker(Environmental env) {    this env = env;          }    public void reminder() {             Calendar cal = Calendar getInstance();             cal setTimeInMills(env getTime());    int hour = cal get(Calendar HOUR_OF_DAY);    if(hour = ) {                env playWavFile( quit_whistle wav );             }          }    } 

使用env getTime()的被测代码并不知道测试环境和真实环境之间的区别 因为它们都实现了相同的接口 现在 你可以借助mock对象 通过把时间设置为已知值 并检查行为是否如预期那样来编写测试

import java util Calendar;    import junit framework TestCase;     public class TestChecker extends TestCase {    public void testQuittingTime() {                MockSystemEnvironment env = new MockSystemEnvironment();                Calendar cal = Calendar getInstance();                cal set(Calendar YEAR );                cal set(Calendar MONTH );                cal set(Calendar DAY_OF_MONTH );                cal set(Calendar HOUR_OF_DAY );  

cal set(Calendar MINUTE );    long t = cal getTimeInMillis();                env setTime(t );                Checker checker = new Checker(env);                checker reminder();                assertFalse(env wavWasPlayed());                 t += ( * * );                env setTime(t );                checker reminder();                assertTrue(env wavWasPlayed());                env resetWav();                t += * * * ;                env setTime(t );                checker reminder();               assertTrue(env wavWasPlayed());          }    }

 

这就是mock对象的全部 伪装出真实世界的某些行为 使你可以集中精力测试好自己的代码

好像有一些麻烦      如果每次都像上面那样自己写具体的mock对象 问题虽然解决了 但是好像有一些麻烦 不要着急 已经有一些第三方现成的mock对象供我们使用了 使用Mock Object进行测试 主要是用来模拟那些在应用中不容易构造(如HttpServletRequest必须在Servlet容器中才能构造出来)或者比较复杂的对象(如JDBC中的ResultSet对象)从而使测试顺利进行的工具 目前 在Java阵营中主要的Mock测试工具有JMock MockCreator Mockrunner EasyMock MockMaker等 在微软的 Net阵营中主要是Nmock NetMock等       下面就以利用EasyMock模拟测试Servlet组件为例 代码如下       编译并将其当做一个Test Case运行 会发现两个测试方法均测试成功 我们可以看到easymock已经帮助我们实现了一些servlet组件的mock对象 这样我们就可以摆脱web容器和servlet容器来轻松的测试servlet了

import easymock *;    import junit framework *;    import javax servlet *;     public class MockRequestTest extends TestCase{    private MockControl control;    private HttpServletRequest mockRequest;    public void testMockRequest(){    //创建一个Mock HttpServletRequest的MockControl对象          control = MockControl createControl(HttpServletRequest class);      //获取一个Mock HttpServletRequest对象          mockRequest = (HttpServletRequest) control getMock();    //设置期望调用的Mock HttpServletRequest对象的方法          mockRequest getParameter( name );    //设置调用方法期望的返回值 并指定调用次数 //以下后两个参数表示最少调用一次 最多调用一次          control setReturnValue( kongxx );           //设置Mock HttpServletRequest的状态 //表示此Mock HttpServletRequest对象可以被使用          control replay();    //使用断言检查调用          assertEquals( kongxx mockRequest getParameter( name ));    //验证期望的调用          control verify();         }    }

编译并将其当做一个Test Case运行 会发现两个测试方法均测试成功 我们可以看到easymock已经帮助我们实现了一些servlet组件的mock对象 这样我们就可以摆脱web容器和servlet容器来轻松的测试servlet了

底层技术是什么?      让我们来回忆一下 如果用户使用C++和java的程序的生成 C++在最后的阶段还需要连接才能生成一个整体程序 这在灵活性与java源代码的机制是不能比的 java的各个类是独立的 打包的那些类也是独立的 只有在加载进去才进行连接 这在代码被加载进去的时候 我们还可以执行很多的动作 如插入一些相关的业务需求 这也是AOP的一个焦点 javassit代码库的实现类似于这 正是利用这些 所以用java实现Mock对象是很简单的

lishixinzhi/Article/program/Java/JSP/201311/19222

北大青鸟java培训:JavaScript代码测试必备的12款工具?

1、JasmineJasmine是一个行为驱动的测试开发框架,用于对JavaScript代码进行测试。
它不依赖其它任何JavaScript框架,也不需要DOM。
它的语法简洁、明确,写测试非常容易。
2、MochaMocha是一个功能丰富的JavaScript测试框架,既运行于Node.js环境中,也可以运行于浏览器环境中。
Mocha以串行方式运行测试,能做出灵活而准确的报告,也能将测试中未捕捉的异常映射到正确的测试用例。
3、ChaiChai是个支持BDD/TDD的库,可用于node和浏览器,可配合任何JavaScript测试框架使用。
4、QUnitQUnit是个功能强大又易于使用的JavaScript单元测试框架。
jQuery、jQueryUI和jQueyMobile项目都使用这个框架,它能测试普通的JavaScript代码。
5、SinonSinon.JS为JavaScript提供了独立的spies、stubs和mocks[译者注:Spy、Stub和Mock都是测试专用名词,Stub常被翻译为桩,spies是Spy的复数形式,是一种可以监视方法、调用和参数的技术]。
它不依赖任何东西,可以配合任何单元测试框架工作。
6、KarmaKarma是针对连通浏览器的一个框架无关测试运行器。
每一个测试结果对应每个浏览器,它的测试和显示都是通过命令行暴露给开发者的,这样他们就可以看到浏览器测试的通过或失败。
7、SeleniumSelenium有一个简单的目标:就是自动化浏览器。
它主要用于自动化测试web应用程序,但是只是很简单地考虑到了基于网络的管理任务。
8、WebdriverIOWebdriverIO允许用户仅添加几行代码就可以控制浏览器或移动应用程序,使测试代码更简单、简洁、易读。
集成的TestRunner同样允许你以同步的方式调用异步命令,这样你不需要关心如何处理Promise以避免竞态条件。
此外,它取消了所有的繁琐的设置工作,并且会为您管理的Selenium会话。
9、NightwatchNightwatch.js是一个易于使用的Node.js,它是为基于浏览器的app和网站设计的终端到终端(E2E)的测试方法。
它使用强大的W3CWebDriverAPI,用于在DOM元素上执行命令和断言。
10、PhantomCSSPhantomCSS获得CasperJS捕获的屏幕截图,并使用Resemble.js将其与基准图进行对比,以测试RGB像素差异。
java课程http://www.kmbdqn.cn/发现PhantomCSS然后生成图像差异对比,用于帮助您找到原因。
11、PhantomFlowPhantomFlow使用决策树提供UI测试方案。
针对PhantomJS,CasperJS和PhantomCSS的NodeJS包装器——PhantomFlow能够流畅地在代码中描述用户流程,同时生成用于可视化的结构化树数据。

关于java mock工具类和mock测试工具哪个不是java语言的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 java mock工具类的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mock测试工具哪个不是java语言、java mock工具类的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:开源api网关系统(api网关管理系统)
下一篇:自动化接口测试(自动化接口测试框架)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~