• 单元测试Struts2Spring项目的Action和Service(包含源码)


    最近,认真实践了单元测试Struts2、Spring等Java项目,今天特意写的是单元测试Struts2Spring项目的Action和Service。

    由于已经写过不少Web开发框架单元测试的代码,加上上次从头搭建环境并发表了"单元测试Struts2的Action(包含源码) ",没有遇到太多问题。

    特别说明:本文是原创,搭建环境、写代码、运行,都是实践并且正确的。

    本文是靠谱的,而非简单的复制-粘贴。

    1.特别说明。

      http://blog.csdn.net/fansunion/article/details/12118043  单元测试Struts2的Action(包含源码)

      这篇文章主要讲述的是如何 使用JUnit等单元测试框架测试 Struts2这一个框架的Action。

      而本篇侧重Struts2和Spring这2个框架集成的情况。

      更多框架集成的单元测试Demo文章,请关注本博客后续 单元测试相关文章。

    2.新建工程,加入相关jar包。

      Struts相关jar包

      Spring相关jar包

      JUnit, spring-test-3.2.3.RELEASE.jar,struts2-junit-plugin-2.2.3.1.jar等测试相关jar包

      Tomcat的Servlet/JSP jar包

    3.新建Action。

    package action; 
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    /**
     * 一个简单的Action。
     * @author FansUnion
     *
     */
    @Controller
    public class UserAction { 
    
     @Autowired
     private UserService userService; 
    
     public String getName() {
      userService.getName("FansUnion");
      return "success";
     }
    } 
    
    


    4.新建Service。

    package action; 
    
    import org.springframework.stereotype.Service; 
    
    @Service
    public class UserService { 
    
     /**
      * 简单的返回用户名
      */
     public String getName(String name) {
      // 这个地方实际上应该调用Dao持久层的代码,在此简化了。
      // 本文只是单元测试Struts2Spring整合中,Struts的Action和Spring注入的Service。
      // Struts2Spring+Hibernate/Mybatis将在后续篇章中介绍。
      return name;
     } 
    
    } 
    
    


    5.单元测试Action。

    package unittest; 
    
    import org.apache.struts2.StrutsSpringTestCase;
    import org.junit.Test; 
    
    import action.UserAction; 
    
    import com.opensymphony.xwork2.ActionProxy; 
    
    /**
     * 测试StrutsSpring集成的时候,需要继承StrutsSpringTestCase这个类,
     * 而单独测试Struts的时候,继承StrutsTestCase。
     *
     * @author http://blog.csdn.net/fansunion/
     *
     */
    public class ActionUnitTest extends StrutsSpringTestCase {
     // 重写父类方法,指定配置文件的名字
     protected String[] getContextLocations() {
      return new String[] { "struts.xml", "applicationContext-spring.xml" };
     } 
    
     @Test
     public void testExecute() throws Exception {
      ActionProxy proxy = getActionProxy("/unitTest");
      UserAction test = (UserAction) proxy.getAction();
      assertNotNull(test);
      String result = proxy.execute();
      assertEquals("success", result);
     }
    } 
    
    


    6.单元测试Service。

    package unittest; 
    
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.springframework.mock.web.MockServletContext;
    import org.springframework.web.context.WebApplicationContext;
    import org.springframework.web.context.support.XmlWebApplicationContext; 
    
    /**
     * 测试Service的基类
     *
     * @author http://blog.csdn.net/fansunion/
     *
     */
    public class JUnitTestBase { 
    
     public static XmlWebApplicationContext context = null; 
    
     public static String[] CONFIG_FILES = { "file:src/applicationContext-*.xml" }; 
    
     public JUnitTestBase() {
      System.out.println("JUnitTestBase");
     } 
    
     @BeforeClass
     public static void setUp() {
      System.out.println("Test start…"); 
    
      context = new XmlWebApplicationContext();
      context.setConfigLocations(CONFIG_FILES); 
    
      MockServletContext msc = new MockServletContext();
      context.setServletContext(msc);
      context.refresh();
      msc.setAttribute(
        WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
        context);
     } 
    
     @AfterClass
     public static void tearUp() {
      System.out.println("Test end!");
     } 
    
    } 
    
    package unittest; 
    
    import static org.junit.Assert.assertEquals; 
    
    import org.junit.Test; 
    
    import action.UserService; 
    
    public class UserServiceTest extends JUnitTestBase { 
    
     private UserService userService; 
    
     public UserServiceTest() {
      userService = context.getBean(UserService.class);
     } 
    
     @Test
     public void test() {
      String name = "http://FansUnion.cn";
      String myName = userService.getName(name);
      assertEquals(name, myName);
     } 
    
    } 
    
    


    7.Struts2配置。

    <struts> 
    
     <!– Development Mode –>
     <constant name="struts.devMode" value="true" />
     <constant name="struts.enable.DynamicMethodInvocation" value="false" />
     <constant name="struts.objectFactory" value="spring" />
     <constant name="struts.objectFactory.spring.autoWire" value="name" /> 
    
     <package name="manager" namespace="/" extends="struts-default"> 
    
      <action name="unitTest" class="userAction" method="getName">
       <result name="success">unitTest.jsp
       </result>
      </action> 
    
     </package>
    </struts> 
    
    


    8.Spring配置。

    (由于是从我的就项目复制类的,很多配置都可以去掉,由读者自己完成)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:flex="http://www.springframework.org/schema/flex" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
     xsi:schemaLocation=" 
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd     
            http://www.springframework.org/schema/tx  
            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
            http://www.springframework.org/schema/aop  
            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-3.0.xsd 
             http://www.springframework.org/schema/flex 
           classpath:/spring-flex-1.0.xsd
        "> 
    
     <context:annotation-config />
     <context:component-scan base-package="*" />
     <aop:aspectj-autoproxy />
    </beans> 
    
      
    


    9.web.xml配置。

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app id="WebApp_ID" version="2.4"
     xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
    
     <!– Spring Context –>
     <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:/applicationContext*.xml</param-value>
     </context-param> 
    
     <!– Spring Context Listener –>
     <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
     </listener> 
    
     <filter>
      <filter-name>struts2</filter-name>
      <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
     </filter> 
    
    
     <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>*.action</url-pattern>
     </filter-mapping> 
    
    
    </web-app> 
    
    


    10.源码下载。

    源码CSDN下载:http://download.csdn.net/detail/fansunion/6332361 (免积分)

    有问题,可以留言,或加入群或者QQ。我抽空答复。

    原文参见:http://FansUnion.cn/articles/2550

  • 相关阅读:
    函数进阶:闭包、装饰器、列表生成式、生成器、迭代器
    函数基础:内置函数
    Python函数基础---参数、变量
    python函数基础:嵌套函数、作用域、匿名函数、高阶函数、递归函数
    三元运算、文件操作
    Python终端如何输出彩色字体
    文件处理: read、readline、 readlines()
    16进制、编码问题
    JSON 操作与转化
    高并发和大型网站架构相关
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463583.html
Copyright © 2020-2023  润新知