Struts面试题:如何测试Action

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Struts面试题:如何测试Action
问题:Struts面试题:如何测试Action 回答:
测试Struts Action 相对比较困难, 因为Struts 是运行在Web 服务器中, 因此要测试Struts Action 就必须发布应用程序然后才能测试,换言之,我们必须要有Web 容器的支持 . 我们想象一下, 对于一个拥有上千个JSP page 和数百甚至数千Java Classes 的大规模应用程序, 要把他们发布到诸如Weblogic 之类的应用服务器再测试, 需要多少的时间和硬件资源所以这种模式的测试是非常费时费力的 .
所以, 如果有一种办法能够不用发布应用程序, 不需要Web 服务器就能象测试普通Java Class 一样测试Struts Action, 那就能极大地加强Struts 的可测试性能, 使应用程序测试更为容易, 简单快速 . 现在这个工具来了, 这就是StrutsTestCase.
StrutsTestCase 是一个开源工具, 可以到 下载. 目前最新版本是2.1.3, 如果你使用Servlet2.3 就下载StrutsTestCase213-2.3.jar, 使用Servlet2.4 的就下载StrutsTestCase213-2.4.jar. 另外StrutsTestCase 本身就是从JUnit 继承的, 所以你还需要下载JUnit3.8.1.
下面就以一个简单的LogonAction 为例测试一下:
public class LogonAction extends Action
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
DynaValidatorForm dynaForm = (DynaValidatorForm)form;
String name = (String)dynaForm.get( username );
String password = (String)dynaForm.get( password );
if (name.equals( wangxq ) password.equals( wangxq ))
request.setAttribute( valid_user ,form);
return mapping.findForward( admin );
return mapping.findForward( success );
LogonAction 的简单说明:从Logon 的页面中输入用户名和密码,在LogonAction 中作判断,并且作相应的跳转。

对其的测试代码如下:
public class LogonActionTest extends MockStrutsTestCase protected void setUp() throws Exception
super.setUp();
setContextDirectory(new File( WebRoot )); // 设置WEB-INF 的上级目录,让程序可以找到struts-config.xml 文件
protected void tearDown() throws Exception
super.tearDown();
public void testNoParameters()
setRequestPathInfo( /logon );
actionPerform();
verifyInputForward();
String[] actionErrors = errors.required , errors.required
verifyActionErrors(actionErrors);
verifyInputForward();
public void testOneParameters()
setRequestPathInfo( /logon );
addRequestParameter( username , wangxq );
actionPerform();
// 校验Action 是否转发到Action Mapping 里的input 属性
verifyInputForward();
String[] actionErrors = errors.required
verifyActionErrors(actionErrors);
verifyInputForward();
public void testSuccessAdmin()
// 设置Request 的请求,说明该Request 请求的是哪一个Action ,或者说,请求的是哪一个 .do 文件。

setRequestPathInfo( /logon );
// 将参数和其对应的值加入到request 中,相当于是action 对应的formbean 传过来的值,即用户在登陆界面输入的值。

addRequestParameter( username , wangxq );
addRequestParameter( password , wangxq );
// 执行这个请求,即执行action 中对应的execute 方法。

actionPerform();
// 验证forward 的名字是否正确,即有没有跳转到预期的页面。

verifyForward( admin );
// 验证没有任何的ActionErrors 。

verifyNoActionErrors();
public void testSuccessLogon()
setRequestPathInfo( /logon );
addRequestParameter( username , aaaaaa );
addRequestParameter( password , bbbbbb );
actionPerform();
verifyForward( success );
verifyNoActionErrors();
补充说明其中的一些方法:
verifyActionErrors/Messages 校验ActionActionServlet controller 是否发送了ActionError 或ActionMessage. 参数为ActionError/Message Key
verifyNoActionErrors/Messages 校验ActionActionServlet controller 没有发送ActionError 或ActionMessage VerifyForward 校验Action 是否正确转发到指定的ActionForward.
VerifyForwardPath 校验Action 是否正确转发到指定的URL
verifyInputForward 校验Action 是否转发到Action Mapping 里的input 属性
其他的方法可以参考具体的文档说明。

还有一点需要说明:
关于Web.xml和Struts-Config.xml
缺省情况下,StrutsTestCase 认为你的Web.xml 和struts-config.xml 的路径分别是:
/WEB-INF/web.xml 和/WEB-INF/struts-config.xml
1. 假如你的web.xml/struts-config.xml 的路径是
d:/application/web/WEB-INF/web.xml(struts-config.xml) 的话, 就需要把d:/ application /web 加到classpath.
或者更简单的方法是setContextDirectory(new File( web )) 这样就可以找到了。

2. 假如你的struts config 是strust-config-module.xml,
那么必须调用setConfigFile() 设置你的struts config 文件
深入使用:
input= /handle.do method=setUp
name= handleForm
type= handleAction
scope= session
parameter= method
validate= true >
这段配置文件中,使用了parameter= method 的配置,这样在测试的时候就需要设置以下:
测试代码中应该加入:
addRequestParameter( method , setUp );
这样,在执行actionPerform() 时,程序就自动进入setUp 的
方法,执行该方法的测试。

另外,也可以用EasyMock来进行Action测试。

相关文档
最新文档