<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

    單元測試Struts2Spring項目的Action和Service

     最近,認(rèn)真實踐了單元測試Struts2、Spring等Java項目,今天特意寫的是單元測試Struts2Spring項目的Action和Service。
      由于已經(jīng)寫過不少Web開發(fā)框架單元測試的代碼,加上上次從頭搭建環(huán)境并發(fā)表了"單元測試Struts2的Action(包含源碼) ",沒有遇到太多問題。
      特別說明:本文是原創(chuàng),搭建環(huán)境、寫代碼、運行,都是實踐并且正確的。
      本文是靠譜的,而非簡單的復(fù)制-粘貼。
      1.特別說明。
      http://blog.csdn.net/fansunion/article/details/12118043  單元測試Struts2的Action(包含源碼)
      這篇文章主要講述的是如何 使用JUnit等單元測試框架測試 Struts2這一個框架的Action。
      而本篇側(cè)重Struts2和Spring這2個框架集成的情況。
      更多框架集成的單元測試Demo文章,請關(guān)注本博客后續(xù) 單元測試相關(guān)文章。
      2.新建工程,加入相關(guān)jar包。
      Struts相關(guān)jar包
      Spring相關(guān)jar包
      JUnit, spring-test-3.2.3.RELEASE.jar,struts2-junit-plugin-2.2.3.1.jar等測試相關(guān)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) {
    // 這個地方實際上應(yīng)該調(diào)用Dao持久層的代碼,在此簡化了。
    // 本文只是單元測試Struts2Spring整合中,Struts的Action和Spring注入的Service。
    // Struts2Spring+Hibernate/Mybatis將在后續(xù)篇章中介紹。
    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);
    }
    }


    4.新建Service。
    package action;
    import org.springframework.stereotype.Service;
    @Service
    public class UserService {
    /**
    * 簡單的返回用戶名
    */
    public String getName(String name) {
    // 這個地方實際上應(yīng)該調(diào)用Dao持久層的代碼,在此簡化了。
    // 本文只是單元測試Struts2Spring整合中,Struts的Action和Spring注入的Service。
    // Struts2Spring+Hibernate/Mybatis將在后續(xù)篇章中介紹。
    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);
    }
    }


    4.新建Service。
    package action;
    import org.springframework.stereotype.Service;
    @Service
    public class UserService {
    /**
    * 簡單的返回用戶名
    */
    public String getName(String name) {
    // 這個地方實際上應(yīng)該調(diào)用Dao持久層的代碼,在此簡化了。
    // 本文只是單元測試Struts2Spring整合中,Struts的Action和Spring注入的Service。
    // Struts2Spring+Hibernate/Mybatis將在后續(xù)篇章中介紹。
    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配置。
     ?。ㄓ捎谑菑奈业木晚椖繌?fù)制類的,很多配置都可以去掉,由讀者自己完成)
    <?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>

    posted on 2013-11-14 10:38 順其自然EVO 閱讀(2881) 評論(0)  編輯  收藏 所屬分類: 測試學(xué)習(xí)專欄

    <2013年11月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲另类自拍丝袜第五页| 亚洲AV乱码一区二区三区林ゆな| 成人人观看的免费毛片| 我的小后妈韩剧在线看免费高清版 | 91免费精品国自产拍在线不卡| 18禁美女裸体免费网站| 久久WWW免费人成一看片| 久久精品国产免费观看| 久久受www免费人成_看片中文| 青青草a免费线观a| 成人毛片免费观看| 午夜视频免费观看| 免费h黄肉动漫在线观看| 亚洲精品无码专区2| 亚洲色欲色欲www在线丝| 国产成人A人亚洲精品无码| 亚洲第一区香蕉_国产a| 亚洲综合激情九月婷婷 | 亚洲精品WWW久久久久久 | 丁香花免费完整高清观看| 成人免费午夜在线观看| 免费的一级片网站| 亚洲?V无码乱码国产精品| 亚洲中文字幕无码爆乳AV| 亚洲国产美国国产综合一区二区| 1区1区3区4区产品亚洲| 亚洲 欧洲 视频 伦小说| 亚洲av综合av一区二区三区 | 亚洲色欲www综合网| 亚洲国产成a人v在线观看| 亚洲AV永久无码精品一福利| 一级毛片正片免费视频手机看| a级片在线免费看| h片在线免费观看| 日本人的色道www免费一区| 国产亚洲美女精品久久久2020 | 国产大片91精品免费观看男同| 亚洲五月午夜免费在线视频| 亚洲av色福利天堂| 亚洲日韩AV无码一区二区三区人| 色网站在线免费观看|