Spring学习12-Spring利⽤mock进⾏单元测试
⼀、概述
对于Java组件开发者来说,他们都盼望拥有⼀组能够对组件开发提供全⾯测试功能的好⽤的单元测试。⼀直以来,与测试独⽴的Java对象相⽐,测试传统型J2EE Web组件是⼀项更为困难的任务,因为Web组件必须运⾏在某种服务器平台上并且它们还要与基于HTTP的Web交互细节相联系。
易测性(在框架中测试每个组件⽽不管其具体种类)是Spring框架所提倡的关键原则之⼀。从这⼀⾓度看,Spring是对核⼼J2EE模型的⼀个重⼤改进—在以前情况下,在容器外进⾏组件测试是很难实现的,⽽且即使是容器内测试也往往要求复杂的安装过程。
jsp编译过程mock测试:就是在测试过程中,对于某些不容易构造或者不容易获取的对象,⽤⼀个虚拟的对象来创建以便测试的测试⽅法。这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品。
⼆、Spring Mock类简介
Mock对象是⼀个术语,原来主要流⾏于eXtreme程序员和JUnit⼩组中。在单元测试上下⽂中,⼀个mock对象是指这样的⼀个对象——它能够⽤⼀些“虚构的占位符”功能来“模拟”实现⼀些对象接⼝。在测试过程中,这些虚构的占位符对象可⽤简单⽅式来模仿对于⼀个组件的期望的⾏为和结果,从⽽让你专注于组件
本⾝的彻底测试⽽不⽤担⼼其它依赖性问题。
Spring从J2EE的Web端为每个关键接⼝提供了⼀个mock实现:
MockHttpServletRequest—⼏乎每个单元测试中都要使⽤这个类,它是J2EE Web应⽤程序最常⽤的接⼝HttpServletRequest的mock实现。
MockHttpServletResponse—此对象⽤于HttpServletResponse接⼝的mock实现。
MockHttpSession—这是另外⼀个经常使⽤的mock对象(后⽂将讨论此类在会话绑定处理中的应⽤)。DelegatingServletInputStream—这个对象⽤于ServletInputStream接⼝的mock实现。DelegatingServletOutputStream—这个对象将代理ServletOutputStream实现。在需要拦截和分析写向⼀个输出流的内容时,你可以使⽤它。
总之,在实现你⾃⼰的测试控制器时,上⾯这些对象是最为有⽤的。然⽽,Spring也提供了下列相应于其它不太常⽤的组件的mock实现(如果你是⼀个底层API开发者,那么你可能会到其各⾃的相应⽤法):
MockExpressionEvaluator—这个mock对象主要应⽤于你想开发并测试你⾃⼰的基于JSTL的标签库时。MockFilterConfig—这是FilterConfig接⼝的⼀个mock实现。
MockPageContext—这是JSP PageContext接⼝的⼀个mock实现。你会发现这个对象的使⽤有利于测试预编译的JSP。
MockRequestDispatcher—RequestDispatcher接⼝的⼀个mock实现,你主要在其它mock对象内使⽤它。MockServletConfig—这是ServletConfig接⼝的⼀个mock实现。在单元测试某种Web组件(例如Struts框架所提供的Web组件)时,要求你设置由MockServletContext-所实现的ServletConfig和ServletContext接⼝。
那么,我们该如何使⽤这些mock对象呢?我们知道,HttpServletRequest是⼀个持有描述HTTP参数的固定值的组件,⽽正是这些参数驱动Web组件的功能。MockHttpServletRequest,作为HttpServletRequest接⼝的⼀个实现,允许你设置这些不可改变的参数。在典型的Web组件测试情形下,你可以实例化这个对象并按如下⽅式设置其中的任何参数:
//指定表单⽅法和表单⾏为
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/main.app");
request.addParameter("choice", expanded);
request.addParameter("contextMenu", "left");
同样地,你可以实例化并全⾯地控制和分析HttpResponse和HttpSession对象。接下来,让我们简要观察Spring所提供的特定的JUnit框架扩展。
数据库连接池技术
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论