<" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Struts 1.2 如何測(cè)試Action

系統(tǒng) 2155 0

在測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(Test-Driven Development TDD)的理念下,單元測(cè)試技術(shù)顯得至關(guān)重要。

在基于Struts項(xiàng)目中,會(huì)有大量封裝業(yè)務(wù)流程的Action類,對(duì)它們的測(cè)試是必要的。但由于Struts1中Action與Servlet容器的耦合程度較深,對(duì)Action的測(cè)試比較困難(Action的execute方法需要HttpServletRequest和HttpServletResponse對(duì)象才能調(diào)用)顯然不適合大規(guī)模,迭代式的測(cè)試。

?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> 對(duì)于在測(cè)試過(guò)程中,對(duì)于某些不易構(gòu)建的對(duì)象(如HTTPServletRequest對(duì)象),可以創(chuàng)建一個(gè)虛擬的對(duì)象以便進(jìn)行測(cè)試,這樣的對(duì)象稱之為mock對(duì)象,mock這個(gè)詞的含義是“模仿,仿制品”。

?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> StrutTest組件作為Junit框架的擴(kuò)展可以為我們創(chuàng)建出用于測(cè)試Strut Action的mock對(duì)象。

?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> 可以從其官方網(wǎng)站下載該組件 http://strutstestcase.sourceforge.net

?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> 下面的Demo用于演示使用strutstest組件對(duì)Struts Action進(jìn)行基于Junit的單元測(cè)試。

?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> 以下是一個(gè)很簡(jiǎn)單的Action及其配置文件,是我們的測(cè)試目標(biāo),這個(gè)Action實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的登登~~登錄功能(這樣的Demo太多了是吧,我盡量保證是最后一次登錄

?<wbr></wbr>

?<wbr></wbr>public class LogonAction extends Action {

?<wbr></wbr>?<wbr></wbr> public ActionForward execute(ActionMapping mapping, ActionForm form,
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> HttpServletRequest request, HttpServletResponse response)
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> throws Exception {
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> LogonForm f = (LogonForm) form;
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> String username = f.getUsername();
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> String password = f.getPassword();
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> if ("whatisjava".equals(username) && "java".equals(password)) {
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> HttpSession session = request.getSession();
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> session.setAttribute("username", username);
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> return mapping.findForward("success");
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> } else {
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> ActionMessages messages = new ActionMessages();
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>messages.add("fail.logon", new ActionMessage("msg.fail.logon"));
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> saveMessages(request, messages);
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> return mapping.findForward("failed");
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> ?<wbr></wbr>?<wbr></wbr> }
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>}

}

?<wbr></wbr>

<action path="/logon" type="action.LogonAction" name="logonForm">
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr><forward name="success" path="/jsp/success.jsp"/>
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr><forward name="failed" path="/jsp/logon_form.jsp"/>
?<wbr></wbr></action>

?<wbr></wbr>

?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> 我們要測(cè)試的目標(biāo)是,登錄成功或失敗后是否返回合適的forward對(duì)象,而且登錄成功后session對(duì)象中是否存有用戶名,而登錄失敗后request中是存有相應(yīng)的ActionMessage對(duì)象。

?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> 首先將下載到的StrutsTest發(fā)行包中的strutstest-2.1.4.jar文件復(fù)制到應(yīng)用的/WEB-INF/lib目錄下,另外該組件的運(yùn)行還需要apache的commons-collections-2.1.jar組件。

?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> 編寫(xiě)單元測(cè)試類TestLogonAction如下,注意:該測(cè)試類要繼承StrutsTest的MockStrutsTestCase類。根據(jù)測(cè)試用例編寫(xiě)測(cè)試方法:testSuccess用于測(cè)試登錄成功的情況而testFailed用于測(cè)試登錄失敗的情形。 MockStrutsTestCase幾個(gè)重要的API需要了解一下:

  • setContextDirectory(File) 用于指定web應(yīng)用的根目錄,StrutsTest在工作的時(shí)候需要讀取Struts配置文件struts-config.xml,StrutsTest會(huì)在指定的根目錄下的WEB-INF目錄下查找struts-config.xml文件。注意,如果使用MyEclipse,它創(chuàng)建Web項(xiàng)目時(shí)會(huì)默認(rèn)在工程目錄下建立一個(gè)名為WebRoot的子目錄作為應(yīng)用的根目錄,這樣就需要運(yùn)行setContextDirectory(new File("WebRoot"))方法。
  • addRequestParameter(String, String) 該方法用于向StrutsTest提供的mock對(duì)象中添加請(qǐng)求參數(shù)對(duì)以模擬用戶提交的請(qǐng)求信息,這里使用該方法添加username和password的請(qǐng)求參數(shù)對(duì)用于模擬用戶的登錄表單提交。
  • setRequestPathInfo(String) 該方法用于設(shè)定要訪問(wèn)的Action,String類型的參數(shù)為要訪問(wèn)的Action在Struts配置文件中對(duì)應(yīng)的path屬性值。
  • getSession() 用于獲取StrutsTest創(chuàng)建的用于模擬HttpSesssion對(duì)象的mock對(duì)象。
  • getRequest() 用于獲取StrutsTest創(chuàng)建的用于模擬HttpServletRequest對(duì)象的mock對(duì)象。
  • verifyForward(String) 斷言方法,表示Action返回的特定的Forward對(duì)象,其中字符串參數(shù)表示應(yīng)該返回的Forward對(duì)象在Struts配置文件中對(duì)于的forward元素的name屬性。例如verifyForward("success"); 如果返回的ActionForward對(duì)象對(duì)應(yīng)的name不是success,則斷言失敗。 verifyForwardPath(String)類似于verifyForward方法,只不過(guò)String參數(shù)表示的是Action返回的forward對(duì)象所對(duì)應(yīng)的URI地址。
  • verifyActionMessages(String[]) 斷言方法,表示request中有一系列特定property名稱的ActionMessage對(duì)象。
  • actionPerform() 執(zhí)行測(cè)試過(guò)程。

?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> 測(cè)試類代碼如下:?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>

public class TestLogonAction extends MockStrutsTestCase {
?<wbr></wbr>?<wbr></wbr> protected void setUp() throws Exception {
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> super.setUp();
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> setContextDirectory(new File("WebRoot"));
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> setRequestPathInfo("/logon");
?<wbr></wbr> ?<wbr></wbr>}

?<wbr></wbr>?<wbr></wbr> public void testSuccess() throws Exception {
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> addRequestParameter("username", "whatisjava");
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> addRequestParameter("password", "java");
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> actionPerform();
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> verifyForward("success");
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> ?<wbr></wbr>verifyForwardPath("/jsp/success.jsp");
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> ?<wbr></wbr>assertEquals("whatisjava", getSession().getAttribute("username"));
?<wbr></wbr>?<wbr></wbr> }

?<wbr></wbr>?<wbr></wbr> public void testFailed() {
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> addRequestParameter("username", "whatisjava");
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> addRequestParameter("password", "avaj");
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> actionPerform();
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> verifyForward("failed");
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> verifyForwardPath("/jsp/logon_form.jsp");
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> verifyActionMessages(new String[]{"msg.fail.logon"});
?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr>?<wbr></wbr> assertNull(getSession().getAttribute("username"));

?<wbr></wbr>?<wbr></wbr> }

}

Struts 1.2 如何測(cè)試Action


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 午夜影院在线 | 国产精品久久大陆 | 久久综合99| 一级黄色录像毛片 | 欧美日本俄罗斯一级毛片 | 久久精品香蕉视频 | 国产精品自在线天天看片 | 亚洲欧美成人网 | 日日lu| 成人欧美午夜视频毛片 | 色综合久久久久久中文网 | 精品乱码一区二区三区在线 | 欧美一级网址 | 欧美美女被爆操 | 久9久9精品视频在线观看 | 久久精品成人免费看 | 亚洲精品不卡视频 | 亚州视频一区二区 | 一级日本特黄毛片视频 | 老师粗又长好猛好爽视频 | 婷婷激情四月 | se94se亚洲欧美在线 | 97av麻豆蜜桃一区二区 | 麻豆国内精品久久久久久 | 91久久青草精品38国产 | 男女羞羞网站 | 91久久亚洲精品一区二区 | 欧美色老头oldvideos | 狠狠地射 | 亚洲区一区 | 美女在线看永久免费网址 | 91精品国产色综合久久不卡蜜 | 午夜精品亚洲 | 四虎影视在线影院在线观看 | 久久精品中文字幕久久 | 国产无卡一级毛片aaa | 久久青草精品一区二区三区 | 九九九九九九伊人 | 国产日韩欧美成人 | 97在线观看免费版 | 99久久免费费视频在线观看 |