AbstractXFireTest擴展于JUnit標準的TestCase類,提供了向某個Web Service發送SOAP請求報文并對返回的SOAP響應報文進行檢驗的能力。該測試類提供了若干個方便的斷言方法,分別介紹如下:
— void assertNoFault(Document node):確認SOAP響應報文無錯誤;
— java.util.List assertValid(java.lang.String xpath, java.lang.Object node):確認在DOM節點特定路徑下有對應的元素,路徑通過XPath表達式進行定義,該方法還將匹配的元素以List對象返回,用戶可以對匹配的元素進行進一步檢驗;
— void assertXPathEquals(java.lang.String xpath, java.lang.String value, Document node):確認特定路徑DOM節點為某一特定值;
— assertInvalid(java.lang.String xpath, java.lang.Object node):確認DOM節點特定路徑下未包含元素。
AbstractXFireSpringTest是AbstractXFireTest的子類,在Spring中用戶只需要擴展該類并實現該類的抽象方法ApplicationContext createContext(),就可以對Spring容器中用XFire定義的Web Service進行測試了。
為了測試Web Service,我們必須準備一個SOAP請求報文,用戶可以簡單地手工編寫一個,或通過SOAP報文截取工具(如前面我們介紹的TcpTrace、SOAPScope、Apache Axis的TCPMon等)獲得一些可用的SOAP請求報文。代碼清單16-6是一個訪問BbtForumService 服務的請求SOAP報文:
代碼清單16-6 request_soap.xml:SOAP報文層面測試
我們將其保存在request_soap.xml文件中,放置在類路徑com/baobaotao/xfire/server下。當該SOAP請求報文發送給BbtForumService的Web Service后,我們預計它應該返回如代碼清單16-7所示的正確的SOAP響應報文:
代碼清單16-7 SOAP響應報文
下面,我們著手編寫測試BbtForumService Web Service的測試類,以驗證實際SOAP響應報文是否和代碼清單16-7中的一樣:
代碼清單16-8 TestBbtForumService
使用AbstractXFireSpringTest測試Web Service首先要做的第一件事是通過實現createContext()方法構造Spring容器,如①所示。當Spring容器啟動時,XFire將自動讓容器中的Web Service生效(僅進行測試,不能對外提供服務)。
第二步需要向Web Service發送一個SOAP請求報文以得到一個SOAP響應報文,如②所示。接下來,通過AbstractXFireTest提供的檢測DOM內容的方法對報文進行正確性驗證。由于代碼清單16?7的SOAP報文體中對應的<getRefinedTopicCountResponse>元素及內部元素都位于http://www.baobaotao.com命名空間中,報文體中沒有為這個命名空間定義相應的別名,為了在后續斷言方法中能夠使用簡單的方式定義XPath表達式,我們在④處為http://www.baobaotao.com命名空間定義了一個別名。
理解以上測試代碼中幾個斷言方法的關鍵在于理解XPath表達式語言,XPath語法內容很豐富,不可能在這里逐一講解,我們只介紹一些典型的XPath語法以滿足常見的測試需求:
— 以“/”為前綴的路徑表示從DOM根路徑開始,如“/soap:Envelope/soap:Body”;
— 以“//”為前綴的路徑表示從DOM任意元素開始查詢,如“//out”表示任意元素為out的元素;
— 元素的屬性通過@attrName表示,如“//xsd:complexType[@name=""Book""]”表示DOM中任意元素名為complexType并且擁有一個值為Book的name屬性的元素;
— 元素的值通過text()表示,如“//test:Response[text()='32']”表示DOM中任意值為32、元素名為Response,且位于test命名空間中的元素。
現在回過頭來看⑤、⑥兩處的斷言方法,相信大家就可以很容易地理解斷言規則了,⑤處的斷言檢測SOAP響應報文是否包含某一特定元素,而⑥處的斷言則對元素內的值進行檢測。我們也可以通過printNode()方法將一個節點輸出到控制臺上,以便于查看。
能夠不啟動Web服務器的情況下通過客戶端程序測試Web Service的功能,這一嶄新的測試方法對于開發人員來說一定頗具吸引力。因為,這意味著用戶可以完全在IDE環境中運行測試,不需要外部環境的支持。不過享受這一測試好處的應用必須保證客戶端和服務端的Web Service都位于同一JVM中,這時請求報文和響應報文直接在JVM內部通道中傳輸。當使用JVM內部通道傳輸請求和響應的SOAP報文時,我們只需要調整服務的地址就可以了:
代碼清單16-9 TextBbtForumService JVM模式測試
以上代碼中,①處的服務地址采用了JVM模式的地址,和其對應的HTTP地址則是http://localhost:8080/baobaotao/service/BbtForumService,所以只需要將服務名前的部分替換為“xfire.local://”就可以了。
posted on 2008-05-15 15:57 々上善若水々 閱讀(4854) 評論(0) 編輯 收藏 所屬分類: WebService
Powered by: BlogJava Copyright © 々上善若水々