emu in blogjava

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            171 隨筆 :: 103 文章 :: 1052 評(píng)論 :: 2 Trackbacks

           
          junit不能測(cè)struts的action,httpunit也只能測(cè)servlet。用struts作項(xiàng)目的時(shí)候無(wú)法方便的對(duì)action層做單元測(cè)試一直是我的心頭大恨。現(xiàn)在好了,我們有了StrutsTestCase。按照網(wǎng)上的介紹,StrutsTestCase用起來(lái)應(yīng)該是非常簡(jiǎn)單的,只要下了jar包回來(lái)引用到工程里面就可以了。實(shí)際上可能也差不多--如果你運(yùn)氣不象我這么臭的話。


          在sourceforge上隨便挑其中一個(gè)鏡象的下載地址:
          http://aleron.dl.sourceforge.net/sourceforge/strutstestcase/strutstest213-1.2_2.4.zip

          flashget回來(lái),放到j(luò)builder的userhome里面,找一個(gè)struts action創(chuàng)建test case,創(chuàng)建的時(shí)候吧test case的基類改為 MockStrutsTestCase,測(cè)試的方法一個(gè)都不用選(因?yàn)槲覀兪且槍?duì)action的具體每一個(gè)邏輯分支測(cè)試而不是具體的某一個(gè)方法)。創(chuàng)建成功后添加一個(gè)測(cè)試:

            public void testSuccessfulRefresh()
            {
              setRequestPathInfo("/RefreshSystemData");
              actionPerform();
              verifyForward("success");
            }

          嘿嘿,我精心挑了一個(gè)沒(méi)有參數(shù)的action來(lái)實(shí)驗(yàn)。

          一切看起來(lái)很順利。run test,噩夢(mèng)開(kāi)始了:

          java.lang.NullPointerException
           at servletunit.struts.MockStrutsTestCase.getActionServlet(MockStrutsTestCase.java:331)
           at servletunit.struts.MockStrutsTestCase.tearDown(MockStrutsTestCase.java:130)
           at hospital.tongren.oa.system.action.TestRefreshSystemDataAction.tearDown(TestRefreshSystemDataAction.java:34)
          ...(Click for full stack trace)...

          還好我沒(méi)有開(kāi)音箱,不然又是一大炮轟出來(lái)。

          看來(lái)要調(diào)試了,先去同一個(gè)地方下了StrutsTestCase原碼回來(lái)
           http://aleron.dl.sourceforge.net/sourceforge/strutstestcase/strutstest-213-src.zip

          加進(jìn)userhome里面的source。debug進(jìn)去,跟到org.apache.struts.action.ActionServlet里面,出錯(cuò)的地方是:

                  InputStream input =
                      getServletContext().getResourceAsStream("/WEB-INF/web.xml");

                  try {
                      digester.parse(input);

                  } catch (IOException e) {
          ....

          input 為空指針。不知道為什么ServletContextSimulator在模擬ServletContext的時(shí)候沒(méi)能夠正確的找到webmodule的位置。上網(wǎng)搜了好一會(huì)兒文檔,在 http://strutstestcase.sourceforge.net/api/servletunit/struts/MockStrutsTestCase.html 中發(fā)現(xiàn)了這樣一段:

          NOTE: By default, the Struts ActionServlet will look for the file WEB-INF/struts-config.xml, so you must place the directory that contains WEB-INF in your CLASSPATH. ...

          先照它說(shuō)的試試把webmodule路徑放進(jìn)classpath中,沒(méi)有用。
          往下看,發(fā)現(xiàn)了這個(gè)好東東:setContextDirectory。在startup中加一句:

          this.setContextDirectory(new File("E:\\projectPath\\webModulePath\\"));

          終于把那個(gè)空指針給過(guò)了。但是報(bào)一個(gè)新的異常:

          junit.framework.AssertionFailedError: received error 400 : Invalid path /RefreshSystemData was requested

           at servletunit.HttpServletResponseSimulator.sendError(HttpServletResponseSimulator.java:463)

           at org.apache.struts.action.RequestProcessor.processMapping(RequestProcessor.java:684)

           at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:242)

           at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)

           at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)

           at servletunit.struts.MockStrutsTestCase.actionPerform(MockStrutsTestCase.java:394)

           at hospital.tongren.oa.system.action.TestRefreshSystemDataAction.testSuccessfulRefresh(TestRefreshSystemDataAction.java:51)

          ...(Click for full stack trace)...


          找不到strutsconfig里面配置的path。strutsconfig是在web.xml里面配置的,應(yīng)該還是web.xml沒(méi)找到造成的,那么就指定strutsconfig文件的位置咯:
              setConfigFile("E:\\......\\struts-config.xml");

          終于可以運(yùn)行起來(lái)了。

          隨后發(fā)現(xiàn),如果  setServletConfigFile("E:\\....\\WEB-INF\\web.xml");的話MockStrutsTestCase也能夠根據(jù)web.xml中的配置找到strutsconfig文件。

          最后把上面用到的絕對(duì)地址E:\\...全部改為相對(duì)地址:
              setContextDirectory(new File("modulePath\\"));
              setServletConfigFile("modulePath\\WEB-INF\\web.xml");
              //   this.setConfigFile("modulePath\\WEB-INF\\config\\system\\struts-config.xml");

          血吐完了,繼續(xù)郁悶,為什么別人都不用配置的這么麻煩呢?到底我做錯(cuò)了什么,還是jbuilder的錯(cuò)?

          CactusStrutsTestCase也沒(méi)配起,好像要加個(gè)什么包吧,再看看先。


          [點(diǎn)擊此處收藏本文]
          發(fā)表于 2005年01月22日 4:04 PM

          emu 發(fā)表于2005-01-22 8:00 PM  
          http://jakarta.apache.org/cactus/getting_started.html 中有詳細(xì)的說(shuō)明。感覺(jué)確實(shí)復(fù)雜了一點(diǎn)。現(xiàn)在進(jìn)展是:

          org.apache.cactus.util.ChainedRuntimeException: Failed to get the test results at [http://localhost:8083/TongRenOA/ServletRedirector]

          at org.apache.cactus.internal.client.connector.http.DefaultHttpClient.doTest_aroundBody0(DefaultHttpClient.java:92)

          at org.apache.cactus.internal.client.connector.http.DefaultHttpClient.doTest_aroundBody1$advice(DefaultHttpClient.java:206)

          at org.apache.cactus.internal.client.connector.http.DefaultHttpClient.doTest(DefaultHttpClient.java)

          at org.apache.cactus.internal.client.connector.http.HttpProtocolHandler.runWebTest(HttpProtocolHandler.java:159)

          at org.apache.cactus.internal.client.connector.http.HttpProtocolHandler.runTest_aroundBody0(HttpProtocolHandler.java:80)

          at org.apache.cactus.internal.client.connector.http.HttpProtocolHandler.runTest_aroundBody1$advice(HttpProtocolHandler.java:206)

          at org.apache.cactus.internal.client.connector.http.HttpProtocolHandler.runTest(HttpProtocolHandler.java)

          at org.apache.cactus.internal.client.ClientTestCaseCaller.runTest(ClientTestCaseCaller.java:144)

          at org.apache.cactus.internal.AbstractCactusTestCase.runBareClient(AbstractCactusTestCase.java:215)

          at org.apache.cactus.internal.AbstractCactusTestCase.runBare(AbstractCactusTestCase.java:133)

          ...(Click for full stack trace)...

          下班先。

          posted on 2005-05-18 16:19 emu 閱讀(2023) 評(píng)論(2)  編輯  收藏 所屬分類: java技術(shù)測(cè)試技術(shù)

          評(píng)論

          # re: StrutsTestCase 試用手記 2005-12-02 12:37 arc365
          我使用StrutsTestCase 進(jìn)行測(cè)試,但是出現(xiàn)了很多錯(cuò)。請(qǐng)大家救救小弟呀…………

          java.lang.NullPointerException
          at servletunit.struts.MockStrutsTestCase.getActionServlet(MockStrutsTestCase.java:231)
          at servletunit.struts.MockStrutsTestCase.tearDown(MockStrutsTestCase.java:126)
          at com.wxl.struts.TestRigisterAction.tearDown(TestRigisterAction.java:42)
          at junit.framework.TestCase.runBare(TestCase.java:130)
          at junit.framework.TestResult$1.protect(TestResult.java:106)
          at junit.framework.TestResult.runProtected(TestResult.java:124)
          at junit.framework.TestResult.run(TestResult.java:109)
          at junit.framework.TestCase.run(TestCase.java:118)
          at junit.framework.TestSuite.runTest(TestSuite.java:208)
          at junit.framework.TestSuite.run(TestSuite.java:203)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

          我查了許多資料,設(shè)置了web.xml和struts-config.xml的路徑之后,還是不行。
          請(qǐng)高手不吝賜教。多謝了……   回復(fù)  更多評(píng)論
            

          # re: StrutsTestCase 試用手記 2005-12-02 14:03 emu
          我不玩java很久了,生疏了。也不知道你用的是StrutsTestCase 的哪個(gè)版本,恐怕幫不上什么忙。
          玩開(kāi)源代碼庫(kù),自己調(diào)試能力要先過(guò)關(guān)。你去下個(gè)strutstestcase的sourcecode包下來(lái),從 servletunit.struts.MockStrutsTestCase 的第231跟下去看看怎么回事吧。  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 连城县| 宁蒗| 青岛市| 德庆县| 隆尧县| 涿州市| 隆化县| 德江县| 宿迁市| 拉萨市| 敦化市| 牟定县| 葵青区| 井陉县| 潮州市| 彭山县| 乐山市| 称多县| 和田县| 噶尔县| 大渡口区| 尼勒克县| 县级市| 广元市| 烟台市| 阳城县| 丰原市| 怀化市| 台安县| 蒲江县| 黄梅县| 格尔木市| 郁南县| 额尔古纳市| 轮台县| 高密市| 景宁| 敖汉旗| 大理市| 准格尔旗| 荥阳市|