2007年10月25日

          1. install the following software
          jre 1.5 or 1.6,  tomcat 5525, eclipse, axis2

          and in eclipse preferences set tomcat to web server, set jre env and set axis2's runtime

          2. create a java project and add axis2 runtime library to its build library

          test ws client sample code:

          public class TestSms
          {
          private static EndpointReference targetEPR = new EndpointReference(
             "http://cdl:8080/axis2/services/Version");

           public static OMElement getGetLeftElement(){
                     OMFactory fac=OMAbstractFactory.getOMFactory();
                     OMNamespace omNs=fac.createOMNamespace("此處填寫WS的命名空間","hw");
                     OMElement method=fac.createOMElement("WS 方法名",omNs);
                     OMElement value = fac.createOMElement("參數(shù)一", omNs);
                     value.addChild(fac.createOMText(value, "值一"));
                     method.addChild(value);
                    
                     value = fac.createOMElement("參數(shù)二", omNs);
                     value.addChild(fac.createOMText(value, "值2"));
                     method.addChild(value);
                    
                   
                     return method;
              }
                
                 public static void main(String[] args){
                        try{
                               Options options=new Options();
                               options.setTo(targetEPR);
                               options.setAction("命名空間/WS 方法名");
                               ServiceClient sender=new ServiceClient();
                               sender.setOptions(options);
                               OMElement sayHello=TestSms.getGetLeftElement();
                               //WSDLConstants.
                              
                               OMElement result=sender.sendReceive(sayHello);
                              
                               OMElement elem = result.getFirstElement();
                               System.out.println(elem.getText());
                               //System.out.println(result);
                        }
                        catch(Exception axisFault){
                               axisFault.printStackTrace();
                        }
                 }

          }



          ref: http://zhangjunhd.blog.51cto.com/113473/23690
          posted @ 2007-10-25 20:58 Java,研究之路 閱讀(379) | 評(píng)論 (0)編輯 收藏

          2007年3月10日

          2006年11月8日

          2006年4月4日

          最近總是打不開網(wǎng)頁(yè)中的JAVA程序, 本來(lái)機(jī)器上有JAVA開發(fā)環(huán)境, 重裝系統(tǒng)一般不安裝JAVA,反正設(shè)置java_home和path中添加javac/java就可以了. 結(jié)果IE總是打不開,也不找到原因. 今天沒(méi)辦法了, 要參加一項(xiàng)考試,只好在網(wǎng)上搜索了一下, 原來(lái)出問(wèn)題總是有原因的.

          參考官方幫助: http://www.java.com/zh_CN/download/help/win_offline.xml

          下載jre運(yùn)行環(huán)境.安裝.

          1. 雙擊該圖標(biāo)打開“Java 控制面板”
          2. 在“Java 控制面板”中選擇“瀏覽器”選項(xiàng)卡
          3. 確保選中“Internet Explorer”、“Netscape”或“Mozilla”旁邊的復(fù)選框
          4. 如果尚未選中,請(qǐng)選中對(duì)應(yīng)的復(fù)選框,為您的 Web 瀏覽器啟用 JRE
          5. 單擊“應(yīng)用”按鈕

          Internet Explorer 4.x 及更高版本

          1. 單擊“工具”-->“Internet 選項(xiàng)”
          2. 選擇“高級(jí)”選項(xiàng)卡,并向下滾動(dòng)到“Java (Sun)”
          3. 選中“使用 Java 2 版本”旁邊的復(fù)選框
          4. 接下來(lái)選擇“安全”選項(xiàng)卡,然后選擇“自定義級(jí)別”按鈕
          5. 向下滾動(dòng)到“Java 小程序腳本”
          6. 確保選中“啟用”單選按鈕。
          7. 單擊“確定”保存您的首選設(shè)置。

          最后不要忘了在這里測(cè)試一下是否安裝成功: http://www.java.com/zh_CN/download/help/testvm.xml

          posted @ 2006-04-04 22:24 Java,研究之路 閱讀(3243) | 評(píng)論 (0)編輯 收藏

          2006年3月10日

          久未在這里練筆了.今天突然想到為什么JAVA在國(guó)內(nèi)始終對(duì)初學(xué)者而言不容易. 是因?yàn)榫W(wǎng)上的DEMO或示例感覺(jué)比.net的少,而且有示例也不是直接能在eclipse或jbuilder中打開的. 一般初學(xué)者估計(jì)IDE不是很熟悉,因此要把示例代碼運(yùn)行起來(lái)就不容易了, 更何況要分析別人的代碼. 相比之下,.net的示例一般是整個(gè)工程,而且由于只有vs IDE,因此提供的示例一般是針對(duì)此平臺(tái)的, 要學(xué)也就容易多了.
          聽(tīng)說(shuō)goolge要收購(gòu)sun java了,如果真是這樣, 應(yīng)該是一件好事, 又多了一個(gè)強(qiáng)有力的競(jìng)爭(zhēng)者, JAVA的前途就光明了.

          一點(diǎn)個(gè)人淺見(jiàn).
          posted @ 2006-03-10 10:29 Java,研究之路 閱讀(433) | 評(píng)論 (1)編輯 收藏

          2005年12月30日


          明天就是2005年最后一天了, 本想休一天假, 只是最近手頭上的項(xiàng)目跟別的公司有關(guān), 脫不了身, 煩燥呀, 準(zhǔn)LP又在罵了, 要生存, 沒(méi)辦法。
          去年底搞了個(gè)今年十大目標(biāo),看了一下,沒(méi)幾個(gè)完成了,估計(jì)只有30-40%完成了。

          整天都在忙,不管是公司的事還是自己的研究,這一年就沒(méi)有幾天晚上是12點(diǎn)之前睡的,在上一個(gè)公司經(jīng)常是晚上11點(diǎn)回去睡覺(jué),現(xiàn)在這家公司是回去之后繼續(xù)搞,所有的業(yè)余愛(ài)好都沒(méi)有了,買了個(gè)DC,也沒(méi)怎么用,什么都沒(méi)有心情,事情總是在那里等著,視力又下降了,身體感覺(jué)不如從前了。記憶力也下降了,前一陣子的事都不記得了,只知道這兩天做了些啥。
          雖然又長(zhǎng)了一歲,其它到是沒(méi)什么長(zhǎng)進(jìn):

           

          • 五一節(jié)前終于換了家公司,計(jì)劃之內(nèi)的事,也算是完成了一項(xiàng)計(jì)劃任務(wù);
          • 今年開始聽(tīng)《余世維》的講座了,學(xué)以致用,沒(méi)地方用,聽(tīng)了也沒(méi)多少長(zhǎng)進(jìn);
          • 上周終于把兩年前買的MP3搞懂如何快進(jìn)了,便宜貨就是不好用;
          • MS出vs2k5,裝上了,也感覺(jué)蠻好用,只是機(jī)器跑不動(dòng)了;
          • 開始使用Eclipse開發(fā)真正的JAVA項(xiàng)目,發(fā)現(xiàn)自己真的是很菜,眼高手低的毛病還是沒(méi)改;
          • 常年出差在外,跟準(zhǔn)LP吵了無(wú)數(shù)次,已經(jīng)是家常便飯了,計(jì)劃明年結(jié)婚,還不知道是否會(huì)途中有變;
          • 聯(lián)系上以前的同學(xué),可是要么不敢說(shuō)話,要么就是沒(méi)話說(shuō);
          • 那個(gè)買的房子還有問(wèn)題,不是我家里漏水,就是別人家漏水來(lái)淹我,唉,人倒霉了擋都擋不住;
          • 周圍的同學(xué)和以前的同事要么結(jié)婚,要么就是準(zhǔn)備當(dāng)爸媽了,想想自己還在外面打工,感覺(jué)自己真是沒(méi)多少出息;
          • 還有,想不起來(lái)了,。。。

            每天都是新的一天,努力做好現(xiàn)在的事才是最重要的,把去年的計(jì)劃拿來(lái)改改,爭(zhēng)取在元旦這幾天弄個(gè)2006年計(jì)劃了,日子再艱難,也得過(guò)呀,畢竟這也是一種生活。

           

          posted @ 2005-12-30 15:25 Java,研究之路 閱讀(431) | 評(píng)論 (1)編輯 收藏

          2005年12月17日

          最近要在一個(gè)項(xiàng)目中使用java, 本來(lái)是用.net開發(fā)的, 可是驗(yàn)收時(shí)用戶要求用java平臺(tái),只好進(jìn)行移植工作了. 一直使用的是.net開發(fā), JAVA只是關(guān)注, 沒(méi)有深入研究, 等實(shí)際應(yīng)用時(shí)才發(fā)現(xiàn)自己水平有限, 問(wèn)題一堆.
          把最近碰上的問(wèn)題做些整理:

          使用JAVA平臺(tái)的問(wèn)題:
          1. 開發(fā)工具太多, 什么Eclipse, jbuilder等,各有不同, 讓人熟悉就花時(shí)間了, 本為以為對(duì)JB比較熟悉,又有2006版本了, 就用它吧, 可是才兩天, 就發(fā)現(xiàn)自己的代碼文件中的中文變?yōu)閬y碼了, 當(dāng)然網(wǎng)上有一堆解決方案, 只是心里不爽, 直接不用了, 改為eclipse了, 操作界面不是很熟悉, 與VS.NET IDE還是有不少區(qū)別, 只是用多了自然就熟悉了,
          又從網(wǎng)上當(dāng)了一堆插件, 什么tomcat, xml編輯器, 沒(méi)有用myeclipse, 雖然支持JSP,以前用過(guò)一下, 也不太好用, 其它的就沒(méi)找到什么好東西了, 時(shí)間也不允許, 至少現(xiàn)在可以調(diào)度JAVA代碼了, JSP的調(diào)試再說(shuō)吧.
          2. 開始整的時(shí)候,發(fā)現(xiàn)自己在WEB開發(fā)方面熟悉的是VS的ASPX事件模型, 反而不知道如何處理JSP了, 只好使用以前ASP的模式, 使用form提交, 感覺(jué)真是太落伍了, 雖然現(xiàn)在有許多AJAX之類的東西, 也支持客戶端事件模型, 實(shí)在沒(méi)時(shí)間研究這些東西了. 先做出來(lái)再說(shuō).
          數(shù)據(jù)庫(kù)連接類使用了以前jive中的幾個(gè)類, 支持在xml中配置連接等, 再自己寫了一個(gè)類, 從XML中讀取SQL語(yǔ)句, 差不多能用.
          3。在網(wǎng)上搜索了一把,未找到在eclipse中對(duì)web service支持比較好的plugin,發(fā)現(xiàn)版本都比較低,似乎久未更新了,JB下到是有不錯(cuò)的設(shè)計(jì)和編譯界面,只是JB其它太爛。


          字符集問(wèn)題:
          使用java首先就要碰上一個(gè)中文字符的顯示和處理問(wèn)題, 這些問(wèn)題總是很煩, 要對(duì)request進(jìn)行編碼才能解決.
          既然使用非MS平臺(tái), 數(shù)據(jù)庫(kù)可能就不會(huì)用到mssql server了, 使用mysql, 發(fā)現(xiàn)要移植以前的數(shù)據(jù)還是比較容易, 但mysql的驅(qū)動(dòng)實(shí)在不好弄, 剛開始使用純JDBC的驅(qū)動(dòng), 結(jié)果發(fā)現(xiàn)在中文字符的處理上始終有問(wèn)題, 只好
          網(wǎng)上查原因, 發(fā)現(xiàn)jdbc驅(qū)動(dòng)的版本太低, 在判斷中文字符上有問(wèn)題, 升級(jí)驅(qū)動(dòng)程序, 可以插入和顯示了, 但SQL中是中文, 可是進(jìn)了數(shù)據(jù)庫(kù)就是亂碼, 試了N遍也不行, 只好改為jdbc-odbc.
          但接下來(lái)在執(zhí)行batch sql時(shí)又報(bào)錯(cuò)了, 說(shuō)mysql odbc driver 的SQL語(yǔ)法錯(cuò), 檢查了半天, SQL也能在mysql中執(zhí)行的, 就是不能通過(guò)JAVA提交執(zhí)行. 用的是mysql 5.0.X, 支持unicode 的編碼建表. 最后只能采用一個(gè)折衷的辦法,自己寫一個(gè)批量執(zhí)行SQL的類,采用“;”分隔多個(gè)SQL,在調(diào)用時(shí)仍然一行一行的執(zhí)行,郁悶。

          最終的字符集解決辦法:
          頁(yè)面上要設(shè)置字符集的輸出格式,如GBK或GB2312,另外,如果使用統(tǒng)一的包含文件定義輸出字符集,還是不行,必須在每個(gè)頁(yè)面中單獨(dú)定義,也可能是我的INCLUDE方式不對(duì);
          數(shù)據(jù)庫(kù)連接字符串中也要設(shè)置編碼;
          在傳遞數(shù)據(jù)到DB的SQL還要對(duì)中文進(jìn)行編碼;
          String key = new String(request.getParameter("txtKey").getBytes("ISO8859_1"));
          最后還有一個(gè)問(wèn)題是,如果TOMCAT編譯JSP文件生成的JAVA文件有亂碼,那么在訪問(wèn)的時(shí)候頁(yè)面上總是要報(bào)錯(cuò),什么"delete tokens"之類的,此時(shí)要?jiǎng)h除掉tomcat\work目錄下的中間編譯代碼才行;


          控件及常用庫(kù)
          WEB控件, 網(wǎng)上有一堆各種各樣的lib和控件, 但這些東西太浪費(fèi)時(shí)間, 光是上網(wǎng)找就比較花時(shí)間了, 下回來(lái)試用也有各種各樣的問(wèn)題,
          每個(gè)控件有自己的特色, 而且每個(gè)總是滿足了這個(gè),滿足不了那個(gè)需求, 要都滿足, 還是要收費(fèi)的才行, 畢竟天下沒(méi)有多少免費(fèi)的午餐;
          主要有幾個(gè):
           1。數(shù)據(jù)顯示表格控件,應(yīng)該能支持排序,有緩存機(jī)制,能分頁(yè),能設(shè)置格式,支持ResultSet或ArrayList之類的,還要有導(dǎo)出excel等功能;最好要能簡(jiǎn)單使用。
           2。圖表控件,最有名的當(dāng)然是cewolf/jfreechart,只是要使用它自己定義的DatasetProducer,不能直接使用ResultSet,也是個(gè)麻煩事,不過(guò)的確是很不錯(cuò)的控件了。


          小結(jié)
          1。經(jīng)過(guò)這次移植,發(fā)現(xiàn)JAVA還是有許多很牛的地方,采用hashmap來(lái)緩存數(shù)據(jù),效率的確很不錯(cuò),只是用得太多,缺乏管理機(jī)制,有點(diǎn)混亂了,下一階段再重構(gòu)一下,形成一個(gè)管理框架最好;
          2。eclipse開發(fā)的確很不錯(cuò),與vs ide差別是比較大,只是使用習(xí)慣了之后發(fā)現(xiàn)其功能強(qiáng)大,而且可以找些plugin來(lái)擴(kuò)展功能,估計(jì)我只是看到了點(diǎn)皮毛而已。
          3。在JAVA下開發(fā),使用Javascript太多,還沒(méi)找到更好解決辦法,水平有限;
          4。與另一個(gè)人一起開發(fā),大家的編程風(fēng)格和代碼不夠規(guī)范,使用了一些重復(fù)的類和方法,這在后期維護(hù)是個(gè)工作,時(shí)間太緊,項(xiàng)目總是這樣,就沒(méi)得多少提高了;

          個(gè)人水平實(shí)在有限,上面只是一面之詞,項(xiàng)目月底才結(jié)束,有什么變更再補(bǔ)充。

          posted @ 2005-12-17 16:02 Java,研究之路 閱讀(1492) | 評(píng)論 (3)編輯 收藏

          2005年10月25日

          不用說(shuō),這種事情一般人如果沒(méi)有經(jīng)歷過(guò),或旁邊沒(méi)有人經(jīng)歷過(guò),要想搞得很清楚,一會(huì)兒就搞定是不可能的。
          在N天前就到辦證中心去拿了一張清單,上面有需要用到的證明文件。查看了一下家里的百寶箱,差不多都有。趁著8月份的五天請(qǐng)假,星期四的時(shí)候去辦理。過(guò)程到不是很復(fù)雜,只拿了張一式兩聯(lián)的準(zhǔn)遷證,當(dāng)時(shí)根本就未在意準(zhǔn)遷證上的內(nèi)容,上面有個(gè)有效期的說(shuō)法。這也只能怪自己粗心大意了。有效期是40天,到差不多過(guò)了一個(gè)月之后即9。10我還在出差,順便讓老婆看了一下,才發(fā)現(xiàn)是有有效期的,趕緊打電話問(wèn)能否延長(zhǎng),這下麻煩了。17號(hào)在成都的時(shí)候,本想托人帶回樂(lè)山給我老爸,可是我再仔細(xì)看了一下,發(fā)現(xiàn)必須在9.20之前回成都辦理好,算了一下時(shí)間,已然來(lái)不及。19號(hào),到辦證中心希望能延長(zhǎng)一下有效期,幸好,他們把有效期延長(zhǎng)了一個(gè)月,趕快EMS給老爸,周三收到,周四到樂(lè)山辦理銷戶并寄回成都,周六在成都收到。9。30,以請(qǐng)了一天假,到辦證中心辦理戶口及身份證,按照要求需要提供:戶口銷戶證明,準(zhǔn)遷證第二聯(lián),身份證及照片兩張。本以為辦證中心旁邊的照相中心說(shuō)不能照非身份證照,慘,又趕快去找了一家普通相館照相。交上各手續(xù),終于拿到了成都市的戶口薄,正準(zhǔn)備辦身份證,說(shuō)是照相的聯(lián)網(wǎng)有問(wèn)題,不能照,旁邊的一群人立刻炸開了鍋,大罵政府辦事有問(wèn)題,甚至有人開始打電話投訴,沒(méi)過(guò)多久,也不知道如何又搞好了,反正又排起長(zhǎng)隊(duì)開始照,我前面有20個(gè)人左右,差不多等了一個(gè)小時(shí),造成老爸的生日午飯也沒(méi)來(lái)得及趕回去吃。照完后又到柜臺(tái)辦理身份證,交上各手續(xù)和20元錢,說(shuō)兩個(gè)月之內(nèi)可以拿到了。唉,真是好事多磨。不僅花了不少郵寄費(fèi),也花了不少時(shí)間和精力。政府為何就不改善一下局面,明知效率低,有問(wèn)題,非得經(jīng)過(guò)這些瑣碎的步驟才行。對(duì)于沒(méi)經(jīng)歷過(guò)的人而言,真的是要耽擱不少時(shí)間。
          posted @ 2005-10-25 08:49 Java,研究之路 閱讀(504) | 評(píng)論 (0)編輯 收藏

          2005年9月15日

          An early look at JUnit 4

          Upcoming release promises evolution in testing

          難度級(jí)別: 中

          Elliotte Harold (elharo@metalab.unc.edu), Adjunct Professor, Polytechnic University

          2005-9-15 (譯)

          原文:http://www-128.ibm.com/developerworks/java/library/j-junit4.html

          JUnit 是JAVA語(yǔ)言事實(shí)上的標(biāo)準(zhǔn)測(cè)試庫(kù)。JUnit 4是三年以來(lái)最具里程碑意義的一次發(fā)布。它的新特性主要是針對(duì)JAVA5中的標(biāo)記(annotation)來(lái)簡(jiǎn)化測(cè)試,而不是利用子類、反射或命名機(jī)制。本文將講述如何使用JUnit 4,當(dāng)前前提是你最好具有JUnit的使用經(jīng)驗(yàn).

          JUnit, 由Kent Beck?和 Erich Gamma開發(fā),幾乎是JAVA開發(fā)最重要的第三方工具。正如Martin Fowler 所說(shuō),“在軟件開發(fā)領(lǐng)域,從來(lái)就沒(méi)有如此少的代碼起到了如此重要的作用“。由于JUnit,JAVA代碼變得更健壯,更可靠,BUG也比以前更少。由于JUnit (由Smalltalk's的SUnit得來(lái)) 的出現(xiàn),隨后產(chǎn)生了許多xUnit的測(cè)試工具,如nUnit (.NET), pyUnit (Python), CppUnit (C++), dUnit (Delphi) 和其它不同平臺(tái)及語(yǔ)言的測(cè)試相關(guān)的工具。

          雖然JUnit也只是一個(gè)工具,但其產(chǎn)生的思想和技術(shù)卻較其架構(gòu)更意義重大。單元測(cè)試,測(cè)試先行的編程方式,測(cè)試驅(qū)動(dòng)的開發(fā)方式,并非必須由JUNIT實(shí)現(xiàn),也不一定要用SWing實(shí)現(xiàn)GUI界面。JUNIT最近的一次更新是在三年前,但它比其它大多數(shù)有BUG的框架都要健壯,更重要的是,JAVA一直在改進(jìn)。現(xiàn)在JAVA支持泛型,枚舉,可變長(zhǎng)度參數(shù),以及標(biāo)記語(yǔ)言(開創(chuàng)了開發(fā)可重用框架的新局面)。

          JUnit's的停滯不前使得那些想要變革的開發(fā)人員換其它測(cè)試工具.挑戰(zhàn)者有Bill Venners的Artima SuiteRunner和Cedric Beust的TestNG.這些工具庫(kù)雖然有值得推薦的功能,但沒(méi)有任何一款的地位能與JUNIT相比,沒(méi)有任何一款工具被其它業(yè)界產(chǎn)品如Ant, Maven, Eclipse廣泛支持.因此Beck 和Gamma雙開始利用JAVA5的新特性來(lái)開發(fā)新版的JUNIT,目的是利用JAVA5中的標(biāo)記特性使得單元測(cè)試開發(fā)更容易。Beck說(shuō):“JUNIT4的主要目的是通過(guò)簡(jiǎn)化JUNIT的使用鼓勵(lì)更多的開發(fā)人員寫更多的測(cè)試”。雖然會(huì)與以前的版本兼容,但JUNIT4與從JUNIT1.0就開始的版本相比會(huì)有一個(gè)非常大的變化.

          注意: 修改基本框架是一把雙刃劍,雖然JUNIT4的目的是清晰的,但細(xì)節(jié)仍有許多不同,因此本文只是一個(gè)簡(jiǎn)單的介紹,并不是最終文檔.

          測(cè)試方法

          以前所有版本的JUNIT都使用命名機(jī)制和反射來(lái)定位測(cè)試,下面的代碼測(cè)試1+1= 2:

          import junit.framework.TestCase;
          
          public class AdditionTest extends TestCase {
          
            private int x = 1;
            private int y = 1;
            
            public void testAddition() {
              int z = x + y;
              assertEquals(2, z);
            }
          
          }

          而在JUNIT 4中,測(cè)試方法由@Test 標(biāo)記說(shuō)明,如下:

          import org.junit.Test;
          import junit.framework.TestCase;
          
          public class AdditionTest extends TestCase {
          
            private int x = 1;
            private int y = 1;
            
            @Test public void testAddition() {
              int z = x + y;
              assertEquals(2, z);
            }
          
          }

          使用標(biāo)記的好處是你不用將所有測(cè)試方法命名為 testFoo(), testBar()等等以"test"開頭的方法,下面的方法也同樣可以工作:

          import org.junit.Test;
          import junit.framework.TestCase;
          
          public class AdditionTest extends TestCase {
          
            private int x = 1;
            private int y = 1;
            
            @Test public void additionTest() {
              int z = x + y;
              assertEquals(2, z);
            }
          
          }

          下面的代碼也同樣正確:

          import org.junit.Test;
          import junit.framework.TestCase;
          
          public class AdditionTest extends TestCase {
          
            private int x = 1;
            private int y = 1;
            
            @Test public void addition() {
              int z = x + y;
              assertEquals(2, z);
            }
          
          }

          這種命名機(jī)制最大的優(yōu)點(diǎn)是更適合你的待測(cè)試類或方法名稱,例如,你可以使用ListTEst.contains()測(cè)試 List.contains();使用ListTest.addAll()測(cè)試 List.add()等等.

          TestCase還可以繼續(xù)使用,但你沒(méi)有必須再擴(kuò)展為子類,只要你聲明了@Test,你可以將測(cè)試方法放在任何類中,當(dāng)然如要訪問(wèn)assert等方法,你必須要引用junit.Assert類,如下:

          import org.junit.Assert;
          
          public class AdditionTest {
          
            private int x = 1;
            private int y = 1;
            
            @Test public void addition() {
              int z = x + y;
              Assert.assertEquals(2, z);
            }
          
          }

          你也可以使用JDK5中的新特性(static import)使得跟以前版本一樣簡(jiǎn)單:

          import static org.junit.Assert.assertEquals;
          
          public class AdditionTest {
          
            private int x = 1;
            private int y = 1;
            
            @Test public void addition() {
              int z = x + y;
              assertEquals(2, z);
            }
          
          }

          這種方法測(cè)試受保護(hù)的方法非常容易,因?yàn)槟憧梢栽跍y(cè)試類中繼承有受保護(hù)方法的類.



          Back to top


          SetUp 和TearDown

          JUnit 3 中test runners 會(huì)在每個(gè)測(cè)試之前自動(dòng)調(diào)用 setUp()方法。此方法主要用于初始化變量,打開日志,重置環(huán)境變量等。下面是XOM's XSLTransformTest中的 setUp()方法:

          protected void setUp() {
                  
              System.setErr(new PrintStream(new ByteArrayOutputStream()));
                  
              inputDir = new File("data");
              inputDir = new File(inputDir, "xslt");
              inputDir = new File(inputDir, "input");
                  
          }

          在JUnit 4中,你仍然可以在每個(gè)測(cè)試前初始化變量和配置環(huán)境,,然而,這些操作可以不用在Setup()中完成,你可以在初始化方法前面添加@Beforer 來(lái)表示,如下:

          @Before protected void initialize() {
                  
              System.setErr(new PrintStream(new ByteArrayOutputStream()));
                  
              inputDir = new File("data");
              inputDir = new File(inputDir, "xslt");
              inputDir = new File(inputDir, "input");
                  
          }

          你也可以有多個(gè)方法標(biāo)記有@Before,所有方法都會(huì)在每個(gè)測(cè)試之前執(zhí)行:

          @Before protected void findTestDataDirectory() {
              inputDir = new File("data");
              inputDir = new File(inputDir, "xslt");
              inputDir = new File(inputDir, "input");
          }
              
           @Before protected void redirectStderr() {
              System.setErr(new PrintStream(new ByteArrayOutputStream()));
          }

          清除環(huán)境與JUNIT3 差不多,在JUNIT3中使用 tearDown()方法,下面的代碼是結(jié)束測(cè)試時(shí)回收內(nèi)存:

          protected void tearDown() {
            doc = null;
            System.gc();   
          } 

          在JUnit 4中,你還可以使用@After標(biāo)記來(lái)說(shuō)明:

          @After protected void disposeDocument() {
            doc = null;
            System.gc();   
          } 

          @Before一樣,你也可以有多個(gè)標(biāo)記有 @After的清除方法,每個(gè)都會(huì)在執(zhí)行完每個(gè)測(cè)試后執(zhí)行。

          最后,你不需要在父類中明確調(diào)用這些初始化或清除方法.test runner會(huì)自動(dòng)調(diào)用這些標(biāo)記的方法.子類中的@Before方法在父類的@Before方法之后執(zhí)行(這與構(gòu)造函數(shù)的執(zhí)行順序一樣),而@After方法剛好相反,子類中的@After方法先執(zhí)行.然而,多個(gè)@Before和@After方法的執(zhí)行順序就是未知的.

          測(cè)試集范圍的初始化

          JUnit 4中引入了一項(xiàng)JUNIT3沒(méi)有的新特性,類級(jí)別的setUp()和tearDown(),即在一個(gè)類的所有測(cè)試前執(zhí)行初始化,并在所有測(cè)試完成后執(zhí)行清除。

          例如,一個(gè)測(cè)試類中的每個(gè)測(cè)試都要用到一個(gè)數(shù)據(jù)庫(kù)連接或網(wǎng)絡(luò)連接,或其它很耗資源初始化或釋放的資源,用不著在每個(gè)測(cè)試方法前后進(jìn)行操作,而只需要在測(cè)試類開始前后執(zhí)行即可。下面的示例是使用第三方的庫(kù)進(jìn)行錯(cuò)誤,在執(zhí)行所有測(cè)試前將錯(cuò)誤先重定向到非標(biāo)準(zhǔn)輸出,然后在所有測(cè)試結(jié)束后再輸出到需要的地方,這樣就不會(huì)影響到測(cè)試過(guò)程中產(chǎn)生的其它信息。

          // This class tests a lot of error conditions, which
          // Xalan annoyingly logs to System.err. This hides System.err 
          // before each test and restores it after each test.
          private PrintStream systemErr;
              
          @BeforeClass protected void redirectStderr() {
              systemErr = System.err; // Hold on to the original value
              System.setErr(new PrintStream(new ByteArrayOutputStream()));
          }
              
          @AfterClass protected void tearDown() {
              // restore the original value
              System.setErr(systemErr);
          }

          上面的操作沒(méi)有必須在每個(gè)測(cè)試前后執(zhí)行。然而要注意的是,這種方法可能影響測(cè)試間的結(jié)果,如果一個(gè)測(cè)試改變了初始化的對(duì)象,而這個(gè)對(duì)象可能是其它測(cè)試的輸入,那么測(cè)試的結(jié)果可能不正確,這種方法將依賴測(cè)試的順序并可能引入BUG。當(dāng)優(yōu)化測(cè)試性能,并且當(dāng)你改進(jìn)了配置和基準(zhǔn)測(cè)試后而仍然很慢時(shí),如數(shù)據(jù)庫(kù)連接或網(wǎng)絡(luò)問(wèn)題,你才需要考慮使用這種方法。只有這樣,你才能每天執(zhí)行多次測(cè)試。



          Back to top


          異常測(cè)試

          異常測(cè)試是JUNIT4中的最大的改進(jìn),以前異常測(cè)試是通過(guò)try catch實(shí)現(xiàn),當(dāng)拋出異常時(shí),在try的最后添加一條fail()語(yǔ)句實(shí)現(xiàn).如下:

          public void testDivisionByZero() {
              
              try {
                  int n = 2 / 0;
                  fail("Divided by zero!");
              }
              catch (ArithmeticException success) {
                  assertNotNull(success.getMessage());
              }
              
          }

          這種方法不僅難看,而且造成無(wú)論成功或失敗,代碼覆蓋工具都不能執(zhí)行某些代碼.而在JUnit 4中,你可以在要拋出異常的代碼中添加標(biāo)記來(lái)聲明一個(gè)異常是期望的:

          @Test(expected=ArithmeticException.class) public void divideByZero() {
              int n = 2 / 0;
          }

          如果沒(méi)有異常拋出,上面的測(cè)試則會(huì)失敗,如果你想知道異常的詳細(xì)信息或其它情況,你還是要使用try catch才行

          Back to top


          需要忽略的測(cè)試

          也許你有些測(cè)試需要很長(zhǎng)時(shí)間才能執(zhí)行完成,并非是這個(gè)測(cè)試應(yīng)該跑得快,而是它做的很復(fù)雜和很慢的工作造成的.如訪問(wèn)遠(yuǎn)程網(wǎng)絡(luò)錯(cuò)誤,需要很久才能有反饋.如果你不想讓這種測(cè)試破壞你整個(gè)測(cè)試過(guò)程,你可能想跳過(guò)這個(gè)測(cè)試.當(dāng)然也有可能某個(gè)測(cè)試超出控制范圍而失敗.如W3C XInclude測(cè)試集中自動(dòng)識(shí)別一些JAVA不支持的Unicode代碼.為了防止這些測(cè)試總是通不過(guò),可以使用標(biāo)記 @Ignore跳過(guò)這些測(cè),如下:

          // Java doesn't yet support the UTF-32BE and UTF32LE encodings
              @Ignore public void testUTF32BE() 
                throws ParsingException, IOException, XIncludeException {
                
                  File input = new File(
                    "data/xinclude/input/UTF32BE.xml"
                  );
                  Document doc = builder.build(input);
                  Document result = XIncluder.resolve(doc);
                  Document expectedResult = builder.build(
                    new File(outputDir, "UTF32BE.xml")
                  );
                  assertEquals(expectedResult, result);
                          
              }

          test runner不會(huì)執(zhí)行這些測(cè)試,但會(huì)說(shuō)明這些測(cè)試被跳過(guò)了。在命令行測(cè)試界面中,字母“I”會(huì)表示測(cè)試跳過(guò),或“E”表示測(cè)試失敗,而不是用點(diǎn)”."表示成功.

          $ java -classpath .:junit.jar org.junit.runner.JUnitCore nu.xom.tests.XIncludeTest
          JUnit version 4.0rc1
          .....I..
          Time: 1.149
          
          OK (7 tests)

          要注意的是,假設(shè)這些測(cè)試由于某種理由放在最開始,如果你以后一直忽略這些測(cè)試,那些需要被測(cè)試的代碼可能有問(wèn)題而不會(huì)被檢測(cè)到。因此忽略測(cè)試只是一個(gè)臨時(shí)解決方法,并不是一個(gè)解決任何問(wèn)題的真正辦法。



          Back to top


          時(shí)間測(cè)試

          性能測(cè)試是單元測(cè)試中最頭疼的問(wèn)題,JUnit 4也未完全解決此問(wèn)題, 你可以在JUNIT4的測(cè)試方法中添加一個(gè)時(shí)間參數(shù)。如果測(cè)試時(shí)間超過(guò)參數(shù),則測(cè)試失敗。如下,如果測(cè)試時(shí)間超過(guò)0.5秒,則此測(cè)試失敗:

          
          @Test(timeout=500) public void retrieveAllElementsInDocument() {
              doc.query("http://*");
          } 

          除基準(zhǔn)性能測(cè)試外,時(shí)間測(cè)試在網(wǎng)絡(luò)測(cè)試方面也很有用.如果一個(gè)遠(yuǎn)端的主機(jī)或數(shù)據(jù)當(dāng)?shù)艋蛱憧梢蕴^(guò)此測(cè)試而不用阻塞在這里,好的測(cè)試集可以在作了一些改動(dòng)后很快的一遍一遍的執(zhí)行,可能一天數(shù)十次.設(shè)置一個(gè)超時(shí)讓測(cè)試更快的執(zhí)行,下面的示例中如果分析http://www.ibiblio.org/xml 的時(shí)間超過(guò)2秒,則測(cè)試失敗.

          
          @Test(timeout=2000) 
            public void remoteBaseRelativeResolutionWithDirectory()
             throws IOException, ParsingException {
                builder.build("http://www.ibiblio.org/xml");
            } 



          Back to top


          新的斷言

          JUnit 4 增加了兩上斷文方法用于比較數(shù)組:

          
          public static void assertEquals(Object[] expected, Object[] actual)
          public static void assertEquals(String message, Object[] expected, 
          Object[] actual)
          

          這兩個(gè)方法采用最直接方法比較,如果數(shù)組長(zhǎng)度相同,且每個(gè)對(duì)應(yīng)的元素相同,則比較成功,否則不成功.參數(shù)為空的情況也作了考慮.

          Back to top


          需要補(bǔ)充的地方

          JUnit 4是一個(gè)非常基本的框架,還不是以前版本的升級(jí)。JUNIT3的開發(fā)人員會(huì)發(fā)現(xiàn)有些功能沒(méi)有。

          • 最大的特點(diǎn)就是沒(méi)有GUI測(cè)試界面,當(dāng)測(cè)試正確時(shí)是綠色條,而出錯(cuò)時(shí)紅色的,你也可以在Eclipse中集成JUNIT使用,但JUNIT4既沒(méi)有AWT也沒(méi)有SWING的GUI測(cè)試界面;
          • 另一個(gè)讓人吃驚的是失敗(期望錯(cuò)誤)和錯(cuò)誤(未預(yù)計(jì)的異常錯(cuò)誤)沒(méi)有明顯區(qū)別,在JUNIT3中開發(fā)人員可以區(qū)分這兩種情況,而在JUNIT4中不行;
          • 最后一個(gè)特點(diǎn)是JUNIT中沒(méi)有用于建立一堆測(cè)試類的suite()方法,取而代之的是,采用變長(zhǎng)參數(shù)傳遞未知數(shù)量的測(cè)試給test runner。

          沒(méi)有GUI測(cè)試界面的確不方便,但其它改變簡(jiǎn)化了JUNIT的使用,從當(dāng)前JUNIT的操作手冊(cè)和FAQ的數(shù)量就知道,而JUNIT4的文檔將不會(huì)需要這么多。



          Back to top


          編譯和運(yùn)行JUnit 4

          現(xiàn)在JUnit 4還沒(méi)有發(fā)布編譯版本,如果想體驗(yàn)版本的樂(lè)趣,則需要從CVS中獲取源代碼。分支標(biāo)簽是"Version4" (see Resources ).要注意的是大部分文檔是根據(jù)JUNIT3編寫的,還未同步更新。需要Java 5才能編譯JUnit 4,因?yàn)榇罅渴褂昧藰?biāo)記,泛型其其它JDK5中的新特性。

          執(zhí)行測(cè)試的命令行方式與JUNIT3有點(diǎn)區(qū)別,你現(xiàn)在要使用 org.junit.runner.JUnitCore 類進(jìn)行測(cè)試,如下:

          
          $ java -classpath .:junit.jar org.junit.runner.JUnitCore 
            TestA TestB TestC...
          JUnit version 4.0rc1
          
          Time: 0.003
          
          OK (0 tests)

          兼容性

          Beck 和Gamma在努力保持后向和前向兼容性。JUnit 4可以直接運(yùn)行根據(jù)JUNIT3編寫的測(cè)試類,而不用任何修改,直接將各測(cè)試類的全名傳遞給test runner即可.test runner會(huì)根據(jù)不同的測(cè)試類調(diào)用不同的測(cè)試框架版本.

          后向兼容性有點(diǎn)麻煩,即在JUNIT3中執(zhí)行根據(jù)JUNIT4寫的測(cè)試類,之所以要這樣是因?yàn)樵谝粋€(gè)集成環(huán)境如Ecplise中,不需要升級(jí)到JUNIT4也可以測(cè)試JUNIT4的測(cè)試類,從而避免工具IDE的升級(jí)。為了讓JUNIT4的測(cè)試類在JUNI3中能執(zhí)行,你需要一個(gè)適配類JUnit4TestAdapter封裝JUNIT3的測(cè)試類,如下代碼:

          public static junit.framework.Test suite() {
            return new JUnit4TestAdapter(AssertionTest.class);    
          }

          而JAVA方面,JUNIT4一點(diǎn)兼容性都沒(méi)有,因?yàn)橥耆蕾囉贘DK5的新特性,因此不可能在JAVA1.4上面執(zhí)行JUNIT4。



          Back to top


          還有...

          JUnit 4遠(yuǎn)未結(jié)束,還有許多需要補(bǔ)充,如文檔,現(xiàn)在不推薦將以前的測(cè)試類升級(jí)到JUNIT4。當(dāng)然JUNIT4的開發(fā)速度很快,其計(jì)劃也很快會(huì)實(shí)現(xiàn),JAVA1.4的開發(fā)人員仍然可以使用JUNIT3.8,而使用JAVA5的人員可以考慮是否采用JUNIT4了,因?yàn)樵谔匦陨细m合。



          Back to top


          資源


          下載測(cè)試版本
          • JUnit 4: Download the newest version of JUnit the SourceForge CVS repository; be sure to use the branch tag "Version4."

          posted @ 2005-09-15 18:02 Java,研究之路 閱讀(2077) | 評(píng)論 (4)編輯 收藏

          2005年4月19日

          1. 首先要安裝jsse,需要jcert.jar,jnet.jar,jsse.jar三個(gè)jar;
          2. 然后添加keystore:
          %JAVA_HOME%\bin\keytool -delete -alias tomcat -keypass changeit

          %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keypass changeit -keyalg RSA

          %JAVA_HOME%\bin\keytool -export -alias tomcat -keypass changeit  -file
          %FILE_NAME%

          %JAVA_HOME%\bin\keytool -import -file server.crt -keypass changeit
          -keystore %JAVA_HOME%/jre/lib/security/cacerts

          %JAVA_HOME%\bin\keytool -import -file server.crt -keystore
          %JAVA_HOME%\jre\lib\security\cacert

          3. 然后在%catalina_home%\conf\server.xml.中取消SSL的注釋.

          4. visit http://localhost:8443/ test it.
          參考 http://jakarta.apache.org/tomcat/tomcat-4.0-doc/ssl-howto.html.
          posted @ 2005-04-19 14:51 Java,研究之路 閱讀(759) | 評(píng)論 (0)編輯 收藏
          僅列出標(biāo)題  
           
          主站蜘蛛池模板: 商城县| 礼泉县| 图片| 彰化县| 娄烦县| 师宗县| 新余市| 渝北区| 沁水县| 巴彦淖尔市| 星子县| 江达县| 施甸县| 静海县| 定兴县| 长治县| 博野县| 平罗县| 专栏| 景宁| 会东县| 宁波市| 缙云县| 台南市| 新化县| 乌兰浩特市| 鄂温| 饶平县| 准格尔旗| 鲁甸县| 彩票| 汉寿县| 乐东| 浮山县| 新安县| 武冈市| 竹山县| 鹿邑县| 安丘市| 平度市| 东台市|