学习目标
完成本单元后,您将能够:
- 使用WSDL2Apex生成Apex类。
- 执行标注以使用SOAP将数据发送到外部服务。
- 使用模拟标注测试标注。
使用WSDL2Apex生成Apex代码
WSDL2Apex从WSDL文档自动生成Apex类。您下载Web服务的WSDL文件,然后上传WSDL,WSDL2Apex为您生成Apex类。 Apex类构造SOAP XML,传输数据,并将响应XML解析到Apex对象中。而不是开发构建和分析Web服务消息的XML的逻辑,让由WSDL2Apex生成的Apex类在内部处理所有这些开销。如果您熟悉WSDL2Java或使用.NET作为Web引用导入WSDL,则此功能类似于WSDL2Apex。别客气。
从WSDL生成一个Apex类
- 从“设置”中,在“快速查找”框中输入“Apex类”,然后单击 Apex Classes.
- 点击 Generate from WSDL.
- 点击 Choose File 然后选择下载的calculator.xml文件。
- 点击 Parse WSDL. 应用程序为WSDL文档中的每个名称空间生成默认的类名称,并报告任何错误。
对于这个例子,使用默认的类名称。但是,在现实生活中,强烈建议您更改默认名称,以使其更易于使用,并使代码更直观。
现在该坦诚地谈谈WSDL解析器了。 WSDL2Apex解析是一个臭名昭着的善变。解析过程可能由于多种原因而失败,例如不支持的类型,多个绑定或未知元素。不幸的是,您可能会被迫手动编写调用Web服务的Apex类或使用HTTP。
- 点击 Generate Apex code. 向导的最后一页显示生成的类以及任何错误。该页面还提供链接以查看成功生成的代码。
生成的Apex类包括用于调用由WSDL文档表示的第三方Web服务的存根类和类类。这些类允许您从Apex调用外部Web服务。对于每个生成的类,使用相同的名称和前缀Async创建第二个类。 calculatorServices类用于同步标注。 AsyncCalculatorServices类用于异步标注。
执行标注
先决条件
在运行此示例之前,请使用“授权端点地址”部分中的步骤来授权Web服务标注的端点URL https://th-apex-soap-service.herokuapp.com
现在你可以执行标注,看看它是否正确添加两个数字。有一个计算器,方便检查结果。
- 从设置档(打开设备齿轮图标)打开开发者控制台。
- 在开发者控制台中,选择 .
- 删除所有现有的代码,并插入下面的代码片段。
calculatorServices.CalculatorImplPort calculator = new calculatorServices.CalculatorImplPort(); Double x = 1.0; Double y = 2.0; Double result = calculator.doAdd(x,y); System.debug(result);
- 选择 Open Log, 然后单击 Execute.
- 调试日志打开后,单击调试只查看System.debug语句的输出。日志应该显示3.0。
测试Web服务标注
所有有经验的Apex开发人员都知道,要部署或打包Apex代码,至少有75%的代码必须具有测试覆盖率。这个覆盖范围包括我们由WSDL2Apex生成的类。您以前可能听说过这个,但测试方法不支持Web服务标注,执行Web服务标注的测试失败。所以,我们有一点工作要做。为了防止测试失败并增加代码覆盖率,Apex提供了一个内置的WebServiceMock接口和Test.setMock方法。您可以使用此接口在测试方法中接收假响应,从而提供必要的测试覆盖率。
为标注指定模拟响应
当您从WSDL创建Apex类时,自动生成的类中的方法调用WebServiceCallout.invoke,该方法执行对外部服务的调用。在测试这些方法时,只要调用WebServiceCallout.invoke,就可以指示Apex运行时生成一个假响应。为此,请实现WebServiceMock接口并指定测试运行时发送的假响应。
指示Apex运行时通过在您的测试方法中调用Test.setMock来发送此假响应。对于第一个参数,传递WebServiceMock.class。对于第二个参数,传递一个WebServiceMock接口实现的新实例。
Test.setMock(WebServiceMock.class, new MyWebServiceMockImpl());
- 在开发者控制台中,选择 .
- 对于类名称,输入AwesomeCalculator,然后单击 OK.
- 用下面的类定义替换自动生成的代码。
public class AwesomeCalculator { public static Double add(Double x, Double y) { calculatorServices.CalculatorImplPort calculator = new calculatorServices.CalculatorImplPort(); return calculator.doAdd(x,y); } }
- 按下CTRL + S保存。
在测试过程中创建您的模拟实现来伪造标注。您的WebServiceMock实现调用doInvoke方法,该方法返回您为测试指定的响应。这些代码大部分是样板。这个练习中最难的部分就是搞清楚Web服务如何返回一个响应,这样你就可以伪造一个值。
- 在开发者控制台中,选择 .
- 对于类名称,输入CalculatorCalloutMock,然后单击 OK.
- 将自动生成的代码替换为以下类定义。
@isTest global class CalculatorCalloutMock implements WebServiceMock { global void doInvoke( Object stub, Object request, Map<String, Object> response, String endpoint, String soapAction, String requestName, String responseNS, String responseName, String responseType) { // 开始 - 指定你想发送的响应 calculatorServices.doAddResponse response_x = new calculatorServices.doAddResponse(); response_x.return_x = 3.0; // 结束 response.put('response_x', response_x); } }
- 按下CTRL + S保存。
最后,您的测试方法需要通过调用Test.setMock来指示Apex运行时发送假响应,然后在AwesomeCalculator类中进行标注。像任何其他测试方法一样,我们断言我们的模拟响应得到了正确的结果。
- 在开发者控制台中,选择 .
- 对于类名称,输入AwesomeCalculatorTest,然后单击 OK.
- 将自动生成的代码替换为以下类定义。
@isTest private class AwesomeCalculatorTest { @isTest static void testCallout() { // 这将导致生成一个假的响应 Test.setMock(WebServiceMock.class, new CalculatorCalloutMock()); // 调用调用标注的方法 Double x = 1.0; Double y = 2.0; Double result = AwesomeCalculator.add(x, y); // 验证是否返回假结果 System.assertEquals(3.0, result); } }
- 按下CTRL + S保存。
- 要运行测试,请选择 .
AwesomeCalculator类现在应该显示100%的代码覆盖率!