ApexREST代码测试与出站集成:REST调用全解析
立即解锁
发布时间: 2025-09-13 01:53:22 阅读量: 11 订阅数: 21 AIGC 


精通Apex编程核心技巧
### Apex REST 代码测试与出站集成:REST 调用全解析
在现代的软件开发中,Apex REST 代码的测试以及对外的 REST 调用是非常重要的环节。本文将详细介绍如何测试 Apex REST 代码,以及如何从 Apex 发起对外部 REST API 的调用。
#### 1. XML 数据处理
在使用 DOM 处理 XML 时,我们可以将整个数据集视为一个节点树进行导航,并根据需要处理部分数据。例如,为我们构建的服务传递的 XML 请求体如下:
```xml
<request>
<Name>West Wish Hospital</Name>
<Ref_Code>WEWISH1</Ref_Code>
</request>
```
要从数据中创建 `XMLDocument` 并检索根元素,可以使用以下代码:
```java
Dom.Document doc = new Dom.Document();
doc.load(data.toString());
Dom.XMLNode req = doc.getRootElement();
```
由于数据是单层的,我们可以简单地遍历根元素的子节点并进行解析,代码如下:
```java
for(Dom.XMLNode childNode : req.getChildElements()) {
dataMapping.put(childNode.getName(),childNode.getText());
}
```
虽然现代 Web 中使用基于 JSON 的有效负载更为常见,但确保自定义端点能够正确解析 XML 也是很重要的。
#### 2. 测试 Apex REST 服务
测试 Apex REST 服务时,我们必须为 `RestContext.request` 属性显式设置 `RestRequest`。以下是测试 `doGet` 方法的步骤:
1. **更新 `HospitalWrapper` 类**:为了让测试能够访问 `Name` 和 `Ref_Code` 属性,我们需要使用 `@TestVisible` 注解对这些属性进行标注。
```java
global class HospitalWrapper {
@TestVisible
String Name;
@TestVisible
String Ref_Code;
public HospitalWrapper(Account acc) {
if(acc != null) {
this.Name = acc.Name;
this.Ref_Code = acc.Hospital_Ref_Code__c;
}
}
}
```
2. **创建测试类和测试数据**:定义一个新的 Apex 测试类 `HospitalRESTService_Test`,并创建一个带有 `@TestSetup` 注解的方法来确保测试中有可检索的记录。
```java
@isTest
private with sharing class HospitalRESTService_Test {
@TestSetup
static void makeData(){
Id hospitalRTId = Schema.SObjectType.Account
.getRecordTypeInfosByDeveloperName()
.get('Hospital').getRecordTypeId();
Account demoHospital = new Account(RecordTypeId =
hospitalRTId, Name = 'Demo', Hospital_Ref_Code__c
= 'DEMO');
insert demoHospital;
}
}
```
3. **测试 `doGet` 方法**:构造一个 `RestRequest` 实例,设置 `requestURI` 和 `httpMethod` 参数,然后将该请求设置为 `RestContext` 变量的值。
```java
@isTest
private static void testRetrieveHospital() {
RestRequest req = new RestRequest();
req.requestURI = '/hospital/DEMO';
req.httpMethod = 'GET';
RestContext.request = req;
Test.startTest();
HospitalRESTService.HospitalWrapper hospital =
HospitalRESTService.doGet();
Test.stopTest();
System.Assert.areNotEqual(null, hospital, 'Null value returned');
System.Assert.areEqual('Demo', hospital.Name, 'Incorrect Name returned');
}
```
同时,我们还可以编写一个类似的测试来验证当没有匹配记录时返回 `null` 的情况。
```java
@isTest
private static void testRetrieveNull() {
RestRequest req = new RestRequest();
req.requestURI = '/hospital/NO_RESULT';
req.httpMethod = 'GET';
RestContext.request = req;
Test.startTest();
HospitalRESTService.HospitalWrapper hospital =
HospitalRESTService.doGet();
Test.stopTest();
System.Assert.areEqual(null, hospital, 'Null value returned');
}
```
4. **测试 `doPost` 方法**:首先,我们需要提取 `API_Mapping__mdt` 记录的检索到一个实用方法中,以便在测试环境中返回记录。
```java
@HttpPost
global static String doPost() {
Id hospitalRTId = Schema.SObjectType.Account
.getRecordTypeInfosByDeveloperName().get('Hospital')
.getRecordTypeId();
List<API_Mapping__mdt> mappings =
retrieveMappingsMetadata();
Map<String, Object> hospitalData = new Map<String,
Object>();
if(RestContext.request.headers.get('Content-Type')
.contains('json')) {
hospitalData = parseData(DATA_TYPE.JSON,
RestContext.request.requestBody);
} else if(RestContext.request.headers.get('Content-Type')
```
0
0
复制全文
相关推荐










