使用WSDL2Apex從網(wǎng)絡(luò)服務(wù)生成Apex類
如果某個(gè)網(wǎng)絡(luò)服務(wù)被定義在WSDL文件中,而Salesforce必須使用SOAP和網(wǎng)絡(luò)服務(wù)進(jìn)行通信,則這種情況在某些時(shí)候會(huì)為開發(fā)者帶來很多麻煩。為了簡(jiǎn)化SOAP請(qǐng)求,可以使用Salesforce中提供的功能將此網(wǎng)絡(luò)服務(wù)轉(zhuǎn)化為Apex類。開發(fā)者可以通過此Apex類調(diào)用網(wǎng)絡(luò)服務(wù),而此Apex類可以自動(dòng)生成和編譯XML信息,省去了手動(dòng)設(shè)置的麻煩。
假設(shè)已經(jīng)有了一個(gè)WSDL文件,包含了網(wǎng)絡(luò)服務(wù)的XML描述。在設(shè)置界面中,搜索“Apex 類”,點(diǎn)擊“Apex 類”鏈接,即可進(jìn)入Salesforce中所有Apex類的一覽表。點(diǎn)擊“從WSDL中生成”,在接下來的窗口中上傳文件,并點(diǎn)擊“分析WSDL”按鈕,Salesforce會(huì)自動(dòng)將WSDL中包含的網(wǎng)絡(luò)服務(wù)生成Apex類。
從WSDL中會(huì)生成兩個(gè)類,分別是用于同步和異步請(qǐng)求的,異步請(qǐng)求的類名比同步請(qǐng)求的類名前面多了“Async”。
使用從網(wǎng)絡(luò)服務(wù)生成的Apex類
從WSDL生成的Apex類可以像正常的Apex類一樣被開發(fā)者使用。當(dāng)調(diào)用其中包含的函數(shù)時(shí),便相當(dāng)于發(fā)送了一個(gè)網(wǎng)絡(luò)服務(wù)請(qǐng)求。
測(cè)試從網(wǎng)絡(luò)服務(wù)生成的Apex類
在測(cè)試從網(wǎng)絡(luò)服務(wù)中生成的Apex類中的函數(shù)時(shí),因?yàn)閱卧獪y(cè)試函數(shù)無法調(diào)用真正的網(wǎng)絡(luò)服務(wù),所以開發(fā)者必須自己生成模擬的網(wǎng)絡(luò)服務(wù)請(qǐng)求和結(jié)果。
Salesforce中提供了WebServiceMock接口和Test.setMock()函數(shù)來實(shí)現(xiàn)這一點(diǎn)。
示例:測(cè)試網(wǎng)絡(luò)服務(wù)類
假設(shè)已經(jīng)從WSDL文件中生成了一個(gè)Apex類,名叫“ExampleServiceClass”,其中包含了某個(gè)函數(shù)“ExampleService()”。
開發(fā)者新建了一個(gè)Apex類“ExampleClass”,其中包含了某個(gè)函數(shù)“DoSomething()”來調(diào)用“ExampleServiceClass”類中的“ExampleService()”函數(shù)并處理結(jié)果?,F(xiàn)在要對(duì)“DoSomething()”函數(shù)編寫單元測(cè)試代碼。
- 首先建立一個(gè)全局的類,實(shí)現(xiàn)WebServiceMock接口,用于模擬網(wǎng)絡(luò)服務(wù)的請(qǐng)求。代碼如下:
@isTest
global class ServiceCalloutMock implements WebServiceMock {
// 實(shí)現(xiàn)接口中的doInvoke()函數(shù)
global void doInvoke(
Object stub,
Object request,
Map<String, Object> response,
String endpoint,
String soapAction,
String requestName,
String responseNS,
String responseName,
String responseType) {
// 接下來,調(diào)用網(wǎng)絡(luò)請(qǐng)求的Apex類中的函數(shù),得到結(jié)果,并將結(jié)果賦值到參數(shù)中的response中。
// response將作為網(wǎng)絡(luò)請(qǐng)求的回應(yīng)被用到單元測(cè)試中。
// ...
}
}
- 建立單元測(cè)試函數(shù)。代碼如下:
@isTest
static void DoSomethingTest() {
// 調(diào)用剛才建立的模擬網(wǎng)絡(luò)服務(wù)請(qǐng)求的類
Test.setMOck(WebServiceMock.class, new ServiceCalloutMock());
// 測(cè)試函數(shù),得到結(jié)果。模擬的網(wǎng)絡(luò)服務(wù)請(qǐng)求結(jié)果會(huì)在這里被使用,取代了調(diào)用真正的網(wǎng)絡(luò)服務(wù)
String result = ExampleClass.DoSomething();
// System.assertEquals(..., result);
}