Junit测试Action

MSN: [email protected]
本文内容:
Junit 测试Action
本文也是在上两个视频的基础进行改动,所以在看本文之前请大家先参考上两个视频。
在没有讲Junit之前,我们首先来了解一下webwork ServletDispatcher的工作原理
ServletDispatcher 是默认的处理 Web Http 请求的调度器,是 WebWork 框架的控制器。相当于 struts1.1 ActionServlet, 同样我们也可以向 Struts 那样对其进行扩展,但一般情况下默认的就满足了我们的开发要求,在 Struts1.2 中,把大多数功能已经移植到 requsetprocess 中。也就是说在 struts 中如果想扩展控制器,我们直接继承 org.apache.struts.action.RequestProcessor 类就可以。如下代码:
java 代码
  1. public class MyRequestProcessor extends RequestProcessor {   
  2.   
  3.       protected boolean processPreprocess(javax.servlet.http.HttpServletRequest request,   
  4.               javax.servlet.http.HttpServletResponse response)  {   
  5. try {   
  6. request.setCharacterEncoding("GBK");   
  7. }   
  8. catch (UnsupportedEncodingException ex) {   
  9. }   
  10. System.out.println("My Request Processor is working...");   
  11. return true;   
  12. }   
在struts中就解决了中文乱码的问题,当然要启动这个控制器,要在struts-config.xml进行配置。配置如下:  <controller processorclass="com.lyx. MyRequestProcessor "></controller>.说了一大多struts的东西.回头来我们来看看webwork又是怎么执行的。
 
所有对Action调用的请求都将通过这个ServletDispatcher调度。它将在web.xml里配置ServletDispatcher时指定。ServletDispatcher接受客户端的HTTP请求,再传给我们的XWork框架,由我们的XWork框架去解析我们的xwork.xml配置文件,根据配置文件的信息,创建对应的Action,组装并调用相应的拦截器,执行Action。当然如果我们想进行扩展我们可以实现com.opensymphony.xwork.interceptor.Interceptor接口,有好多功能供你使用。
ServletDispatcher的主要功能调用如下:
一、init()方法在服务器启动时调用,
 1、检查是否支持配置文件重新载入功能。
 2、设置一些文件上传的信息,比如:上传临时目录,上传的最大字节等。都设置在webwork.properties文件里,如果在classpath中找不到这个属性文件,它会去读取默认的default.properties
当然还有更多的功能,大家可以参考webwork的帮助文档
 
二、service()方法,每次客户端的请求都将调用此方法。
  通过request请求取得action的命名空间(namespace,与xwork.xml配置文件里package标签的name对应)
  例如:我们的例子中com.lyx.web.action.LoginAction,取得的命名空间为com.lyx.web.action
在xwork.xml配置文件如下:
xml 代码
  1. <package name="default" extends="webwork-default">  
  2.         <action name="login" class="com.lyx.web.action.LoginAction">  
  3.     action>  
  4.     package>  
这些代码大家应该很熟悉吧,就不多述了。
如果要进行单元测试还有一个是我们必须关注的extraContext。我们可以通过ActionServlet的方法或是属性得到。至于原理在这里就不多说了,大家可以参考webwork中文文档上面写的很详细。
根据前面获得的namespace、actionName、extraContext,创建一个ActonProxy。
创建代码如下:
java 代码
  1. ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(   
  2.                 "com.lyx.web.action""login", extraContext);   
这个ActionProxy可以读取namespace、actionName读取xwork.xml配置文件里这个Action的所有配置信。
有了namespace,actionName,extraContext,ActionProxy我们就可以完成单元测试了。
新建一个Junit类代码如下:
结合上述的文档,试试吧。
这里一定要注意 junit 包一定要引入。
java 代码
  1. import java.util.HashMap;   
  2. import java.util.Map;   
  3.   
  4. import com.opensymphony.xwork.ActionContext;   
  5. import com.opensymphony.xwork.ActionProxy;   
  6. import com.opensymphony.xwork.ActionProxyFactory;   
  7.   
  8. import junit.framework.TestCase;   
  9.   
  10. public class LoginActionTest extends TestCase {   
  11.     @SuppressWarnings("unchecked")   
  12.     public void testExecute() throws Exception {   
  13.         Map params = new HashMap();   
  14.         params.put("user.userName""lyx");   
  15.         params.put("user.userPwd""lyx");   
  16.         Map extraContext = new HashMap();   
  17.         extraContext.put(ActionContext.PARAMETERS, params);   
  18.   
  19.         ActionProxy proxy = ActionProxyFactory.getFactory().createActionProxy(   
  20.                 "com.lyx.web.action""login", extraContext);   
  21.         proxy.setExecuteResult(false);   
  22.         assertEquals(proxy.execute(), "success");   
  23.   
  24.         LoginAction action = (LoginAction) proxy.getAction();   
  25.         assertEquals(action.getUser().getUserName(), "lyx");   
  26.         assertEquals(action.getUser().getUserPwd(), "lyx");   
  27.   
  28.     }   
  29.   
  30. }   
基本的代码就写完了,还有其它的没有解释,大家再回来看看。就应该可以明白了。
在建一个 TestSuite 测试一下吧。
java 代码
  1. package test.com.test;   
  2.   
  3. import junit.framework.Test;   
  4. import junit.framework.TestSuite;   
  5.   
  6. public class AllTests {   
  7.   
  8.     public static Test suite() {   
  9.         TestSuite suite = new TestSuite("Test for test.com.test");   
  10.         //$JUnit-BEGIN$   
  11.         suite.addTestSuite(LoginActionTest.class);   
  12.         //$JUnit-END$   
  13.         return suite;   
  14.     }   
  15.   
  16. }   
运行此类,如果全是绿色,就通过了。试试看吧。
OK通过了,测试的用户名和密码都为 ”lyx”, 改一下试试。
改了密码就对了。呵呵。
OK了。就到这里吧。
希望大家多提宝贵意见。上面有的我联系方式。

你可能感兴趣的:(Web,struts,JUnit,单元测试,Webwork)