You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

切换HTTP为HTTPS后Apex类单元测试失败,无法部署至生产环境

解决Apex类切换HTTPS后单元测试失败及客户端证书配置问题

我来帮你梳理下这个问题的解决方案——从HTTP切换到HTTPS后单元测试失败,还要配置Salesforce客户端证书加密敏感数据,这两个点其实是关联的,咱们一步步来处理:

一、先搞清楚单元测试失败的核心原因

切换到HTTPS后测试失败,大概率是这两个问题:

  • 真实Callout被测试环境拦截:Salesforce单元测试默认禁止发起真实的外部Callout,你切换HTTPS后如果没配置测试模拟,直接跑测试肯定报错
  • 证书/权限未在测试环境生效:客户端证书的配置可能只在生产/沙盒主环境生效,测试上下文里没同步权限或配置

二、配置Salesforce客户端证书(加密敏感数据)

要实现HTTPS+客户端证书加密,先完成这几步配置:

  1. 上传客户端证书:进入Salesforce Setup → Certificate and Key Management,创建自签名证书或者上传CA签发的证书(推荐后者,安全性更高)
  2. 关联证书到远程站点:在Remote Site Settings找到你的HTTPS端点,勾选Require Client Certificate,并选择刚上传的证书
  3. 配置权限:给运行代码的用户(包括测试用户)的Profile/Permission Set添加证书访问权限,或者确保Apex类有足够权限访问证书资源

三、调整Apex代码适配HTTPS与证书

给你的代码做些针对性修改,确保HTTPS和证书生效:

public class SomeClass { 
    @future(callout=true) 
    public static void SendData(String id, String name, String token) { 
        HttpRequest req = new HttpRequest(); 
        // 替换为你的HTTPS目标端点
        req.setEndpoint('https://your-target-framework.com/api/data-push'); 
        req.setMethod('POST');
        // 配置认证头(根据目标框架要求调整)
        req.setHeader('Authorization', 'Bearer ' + token);
        // 显式指定客户端证书(关联远程站点后也会自动用,但显式设置更稳妥)
        req.setClientCertificateName('Your_Uploaded_Certificate_Name');
        // 序列化敏感数据为请求体
        String requestBody = JSON.serialize(new Map<String, String>{
            'id' => id,
            'name' => name
        });
        req.setBody(requestBody);
        
        Http http = new Http();
        HTTPResponse res = http.send(req);
        // 添加错误处理逻辑
        if(res.getStatusCode() != 200) {
            System.debug('数据推送失败:' + res.getStatus() + ' | 响应内容:' + res.getBody());
            // 可选:插入错误日志记录到自定义对象
        }
    }
}

四、修复单元测试:模拟HTTPS Callout

因为单元测试不能发起真实的外部请求,必须用HttpCalloutMock模拟响应:

@isTest
private class SomeClassTest {
    // 定义模拟响应的类
    private class MockHttpsResponse implements HttpCalloutMock {
        public HTTPResponse respond(HTTPRequest req) {
            HTTPResponse res = new HTTPResponse();
            res.setStatusCode(200);
            res.setStatus('OK');
            res.setBody('{"status": "success", "message": "数据已接收"}');
            return res;
        }
    }

    @isTest static void testSendData_Https() {
        // 配置Mock拦截Callout
        Test.setMock(HttpCalloutMock.class, new MockHttpsResponse());
        
        // 触发@future方法(必须用Test.start/stopTest包裹)
        Test.startTest();
        SomeClass.SendData('test-id-001', '测试用户', 'test-auth-token');
        Test.stopTest();
        
        // 这里可以添加具体的验证逻辑,比如检查日志、自定义对象记录等
        System.assert(true, 'HTTPS推送的单元测试执行成功');
    }
}

五、额外排查要点

  • 确认远程站点设置里的HTTPS地址正确,且已激活
  • 检查证书的有效期,CA签发的证书要确保Salesforce信任其根证书
  • 测试运行用户必须有访问该远程站点和证书的权限

内容的提问来源于stack exchange,提问作者Jhoira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:17:32