Stub(樁件)的作用是:如果一個接口有很多方法,如果要實作這個接口,就要實作所有的方法。但是一個類從業務來說,可能隻需要其中一兩個方法。如果直接去實作這個接口,除了實作所需的方法,還要實作其他所有的無關方法。而如果通過繼承存根類就實作接口,就免去了這種麻煩。對stub應答的設定是為了通過測試。 stubs隻檢查的是狀态(state)。
本章内容:
n 使用SoapUI工具生成一個WSDL優先的web 服務
n 在測試前,開發一個SOAP web服務
n 使用一個WSDL更新一個SOAP項目
n 使用WSDL 重構更新一個SOAP項目
n 測試前,生成并開發一個RESTful webservice stub(樁件)
n 使用REST discovery生成SoapUI測試
1.1 簡介
Web Service Stubs一般是在項目早期階段就被開發,Stubs目的是:當整個web服務被實作時,給客服端提供有限的功能。該章節将告訴,使用SoapUI怎麼幫助你快速測試和開發簡單的Java REST和SOAP web服務Stubs、以及如何通過錄制web服務的互動過程生成測試?使用JAVA編寫的Web Service Stub能使用Java成功執行。
除了對基本的SoapUI測試提供快速的熱身之外,服務接口和實作示例将在本書後面被重用作更進階主題的基礎。
在本章你能學到什麼,大緻的内容如下:
1. 怎麼使用SoapUI的WSDL幫助你測試、更新、重構、開發一個簡單的SOAP Web 服務的Stub。
2. 怎麼使用SoapUI幫助你測試、開發一個簡單的RESTWeb服務的Stub
3. 怎麼使用SoapUI的發現(discovery)功能生産測試
4. 使用Apache CXF生成、實作并運作基礎的JAX-RS和JAX-WS Web服務Stubs
在學習前,你需要部署環境,你需要如下軟體:
Ø JDK:編譯運作代碼(1.6以上)
Ø Apach CXF:用于建構、運作(有時),REST和SOAP Web服務
Ø IDE(可選):使用一個IDE,例如Eclipse,能更容易的發現、編譯、執行執行個體代碼
本文開始,不包括SoapUI的安裝、啟動、SoapUI概述,直接從如何建立基礎的SoapUI REST和SOAP 項目、測試、斷言(assertion)開始。如果想從起步開始,可以看:http://www.soapui.org
1.2 使用SoapUI工具生成一個WSDL優先的Web服務
本部分将展示,怎麼把Apache CXF內建到SoapUI工具上生成一個可運作的空Java Web服務,該服務是使用它的WSDL實作的。這可能是有用,如果需要一個快速的菜單驅動方法去建立一個Soap Web服務,該Web服務能獨立被實作和部署到SoapUI上。
1.2.1準備開始
該WSDL被用于定義一個簡單的invoice WEB 服務。它隻有一個函數(operation)去引用一個基本的invoice文檔,該操作的參數invoice數量:
l Operation:getInvoice
l Request:invoiceNo : string
l Response:InvoiceDocument(invoiceNo : string, company : string, amount: string)
l Location: http://localhost:9001/ws/invoice/v1
該WSDL可以在本章代碼塊中:soap/invoicev1/wsdl/invoice_v1.wsdl。在這之前需要把Apache CXFWeb服務架構內建到SoapUI工具生成Web服務Stub。下載下傳最新版本的下載下傳連結:http://cxf.apache.org/download.html(我使用3.2.1版本)。版本3.01需要JDK1.7。
1.2.2 建立步驟
首先,配置SoapUI能夠生産并建構invoice的web服務。這時,作為一個标準的Java運作該服務。執行的步驟如下:
1. 啟動并打開SoapUI,選擇ToolsàApache CXF,點選右下角的Tools,進入SoapUI Preferences視窗:
這時在CXF 2.X中選擇下載下傳的Apache CXF的bin目錄:
2. 在如下界面:
輸入如下資訊:
l WSDL:<chapter1 samples>/soap/invoicev1/wsdl/invoice_v1.wsdl,如果這已經填了,在CustomArgs中的Tool Args中就不需要填寫,不讓回報錯!
l Output directory:生成代碼存放的位置。例如: <chapter1 samples>/soap/invoicev1/src/main/java
l Package:生成源代碼的包名,例如:ws.invoice.v1
l Artifact Options:隻選擇Server和Implementation。對于,client與build.xml 也是可用的。我們使用SoapUI作為用戶端且不需要Ant
3. 為了自動編譯生成的服務代碼,在Advanced的Tab下:
進行如下操作:
l 選擇Compile。
l 提供一個ClassFolder值,作為存放結果Java類檔案的存放目錄,例如:<chapter1 samples>/soap/invoicev1/target/classes
l 選中“ValidateWSDL(可選)”檢查WSDL檔案(在進階Tab下檢查結構和使用基礎WS-I編譯檢查WSDL)。Invoice_v1.wsdl不應該輸出任何東西。
4. 在Custom Args Tab下,把WSDL所在位置輸入在Tool Args中。這告訴web服務在運作時從哪裡找到WSDL檔案。設定像invoice_v1.wsdl的值是被期望作為classes的根目錄。
PS:如果在Basic Tab下的WSDL路徑已經填寫了,這裡就不需要填寫,如果填寫了,會報錯誤“WSDLToJava Error”:
5. 點選”Genrate”按鈕。如果執行成功,輸出類似如下的結果:
可以在輸出檔案路徑下,看到成的Java源碼檔案,輸出檔案路徑例如:<chapter1 samples>/soap/invoicev1/src/main/java/ws/invoice/v1/。在class目錄下關聯class檔案:<chapter1samples>/soap/invoicev1/target/classes/ws/invoice/v1/。
注意:MAC/LinuxIssue:如果出現一個像“./wsdl2java.sh: No such file or directory”的錯誤,這時解決辦法是:打開<Apache CXF Home>/bin/wsdl2java.sh,然後複制wsdl2java内容到wsdl2java.sh;指令是:cp wsdl2java wsdl2java.sh
6. 在運作服務之前,需要複制invoice_v1.wsdl檔案到生成的類目錄下,例如類目錄為:<chapter1 samples>/soap/invoicev1/target/classes。否則,當運作服務時,将看到一個類似“[failed toocalize]cannot.load.wsdl(invoice_v1.wsdl)”的錯誤。
PS:由于wsdl需要通路http://soapui.cookbook.example,這個來擷取targetNamespace以及SOAPOperation等,本網站無法通路,造成提示上述問題,以至于下面的服務啟動提示該問題!!!!
7. 最後,啟動服務。執行指令:
cd <chapter1samples>/soap/invoicev1/target/classes
javaws.invoice.v1.InvoicePortType_InvoicePort_Server
為了确認服務是否啟動成功,打開浏覽器,在浏覽器輸入:http://localhost:9001/ws/invoice/v1?wsdl,這時候如果看到invoice_v1.wsdl正常顯示,說明生産的服務已經啟動并正常運作。
1.2.3 如何工作
SoapUI實際上正在為各種Web服務架構建構指令行參數。在上述的例子中,喜歡使用指令的可以直接運作:<Apache CXF Home>/bin/wsdl2java
n 注意:Apache CXF wsdl2javascript
關于wsdl2java的資訊,可以看:http://cxf.apache.org/docs/wsdl-to-java.html, 快速看下生成的源檔案。主要包括如下幾點:
1. 運作wsdl2java選項生成Java标準的JAX-WS Web服務代碼,該代碼帶有源自WSDL檔案的類型和方法。
2. Java JDK附帶一個JAX-WS的實作:
² 不需要任何編譯或者運作時依賴的庫,例如:Apache CXF庫
² 不需要servlet容器來釋出web服務,例如Tomcat或者Jetty。如果檢視InvoicePortType_InvoicePort_Server.java,可看到服務已經被釋出,釋出的服務使用的是JDK預設的HTTP服務中的javax.xml.ws.Endpoint類。這個靜态的Endpoint.publish(…)方法綁定生成的服務implementation(InvoicePortImpl.java)到endpoint 位址,以至于invoice請求能被getInvoice()方法處理。
² 該服務是非常容易移植的,隻需要一個Java JRE就能運作它
² 在運作時需要WSDL檔案。wsdlLocation參數被應用于第4步,被設定成InvoicePortImpl.java類中@javax.jws.webService注釋的一個屬性。
² 服務的Emdpoint和逾時(預設值為5分鐘)很容易更改。對InvoicePortType_InvoicePort_Server.java進行如下修改:
l Endpoint: String address="http://localhost:9001/ws/invoice/v1";