Apache Struts2 文档之 JUnitPlugin

Apache Struts 2 Documentation > Home > Guides > Plugin Developers Guide > JUnit Plugin
Apache Struts2 文档之 JUnitPlugin
JUnit Plugin 提供了与流行的单元测试框架JUnit的集成
此插件提供了一个基本的StrutsTestCase类,他能用于子类化Struts2组件的测试。并用于Struts2本身的组件和很多绑定插件的测试。此插件也提供了StrutsSpringTestCase来支持用Spring作为对象工厂的 action测试
更多细节,请查看ActionTest(%struts-2.2.3.1%\docs\WW\testing-actions.html)
Struts Actions(未使用Spring)
不使用Spring来测试Actions,要继承StrutsTestCase。以下实例显示了测试Actions的两种不同方式:
  <struts>
      <constant name="struts.objectFactory" value="spring"/>
      <package name="test" namespace="/test" extends="struts-default">
          <action name="testAction" class="org.apache.struts2.TestAction">
              <result type="freemarker">/template.ftl</result>
          </action>
      </package>
  </struts>
  MyNote:
  以上代码表明 struts的对象工厂为spring,并定义了一个TestAction
  Action:
  public class TestAction extends ActionSupport {
      private String name;
      public String getName() {
          return name;
      }
      public void setName(String name) {
          this.name = name;
      }
  }
  MyNote:
  TestAction仅仅有一个name属性及其getter,setter
  JUnit:
  package org.apache.struts2;
  import org.apache.struts2.dispatcher.mapper.ActionMapping;
  import java.util.HashMap;
  import java.io.UnsupportedEncodingException;
  import com.opensymphony.xwork2.ActionProxy;
  import com.opensymphony.xwork2.Action;
  import javax.servlet.ServletException;
  public class StrutsTestCaseTest extends StrutsTestCase {//MyNote:需要继承StrutsTestCase
  /**MyNote:测试 是否存在请求的Action路径,并对命名空间及action的名字分别进行测试*/
      public void testGetActionMapping() {
          ActionMapping mapping = getActionMapping("/test/testAction.action");
          assertNotNull(mapping);
          assertEquals("/test", mapping.getNamespace());
          assertEquals("testAction", mapping.getName());
      }
  /**MyNote: 模拟带参数的某个请求,并测试其结果是否正确
  在StrutsTestCase的超类中提供了 request
  通过获得ActionProxy来注入参数
  */
      public void testGetActionProxy() throws Exception {
          //set parameters before calling getActionProxy
          request.setParameter("name", "FD");  
          ActionProxy proxy = getActionProxy("/test/testAction.action");
          assertNotNull(proxy);
          TestAction action = (TestAction) proxy.getAction();
          assertNotNull(action);
          String result = proxy.execute();
          assertEquals(Action.SUCCESS, result);
          assertEquals("FD", action.getName());
      }
  /**MyNote:直接执行某个Action来判断输出*/
      public void testExecuteAction() throws ServletException, UnsupportedEncodingException {
          String output = executeAction("/test/testAction.action");
          assertEquals("Hello", output);
      }
  /**MyNote:在执行Action后测试值栈中的值*/
      public void testGetValueFromStack() throws ServletException, UnsupportedEncodingException {
          request.setParameter("name", "FD");
          executeAction("/test/testAction.action");
          String name = (String) findValueAfterExecute("name");
          assertEquals("FD", name);
      }
  }
模板:
  如果你使用JSP作为模板引擎,你将不能在容器外测试Action的输出。EmbeddedJSP Plugin(内嵌的JSP插件)可用于越过这种限制,并能在classpath(类路径)和容器外使用JSP
方法描述
  以下是StrutsTestCase中定义的工具方法和Mock'对象来简化测试。
方法名 描述
executeAction(String ) 转换action的URL,并返回action的输出。这个输出不是Action的result( 如"success"),而是并写入的结果流。要使用这个action 必须使用一个来自classpath的结果类型,如Freemarker,velicity等等,如果你使用了EmbeddedJspPlugin 你也可以使用JSP
getActionProxy(String) 构建一个ActionProxy.可通过在返回的代理对象上调用execute方法调用Action,exection方法的返回结果是action结果(如"success")
getActionMapping(String) 获得参数url的ActionMapping对象
injectStrutsDependencies (Object) 注入Struts依赖的对象
findValueAfterExecute(String) 在Action执行后,在值栈中查找一个对象
属性 描述
MockHttpServletRequest  request 传给Struts的request对象。确保在调用getActionProxy这样的方法前在mock对象中设置参数
MockHttpServletResponse response 传给Struts的response对象。你可以使用这个类测试输出和响应头等
MockServletContext servletContext 传给Struts的ServletContext对象

使用Spring的StrutsAction
确保将SpringPlugin依赖加入到pom.xml中(MyNoe:如果不使用Maven,直接将插件jar拷入项目lib即可)
  <dependency>
      <groupId>org.apache.struts</groupId>
      <artifactId>struts2-spring-plugin</artifactId>
      <version>STRUTS_VERSION</version>
  </dependency>
如果你使用Spring作为对象工厂。StrutsSpringTestCase可用于编写你的单元测试。这个类继承自StrutsTestCase并有一个ApplicationContext类型的applicationContext属性。
SpringContext 默认从classpath*:applicationContext.xml进行加载。为提供一个不同的位置,请重写getContextLocations.


  
  

你可能感兴趣的:(struts2,JUnit)