salesforce apex测试类如果有多个httpmock,则只会返回一个,导致可能不符合预期

在 Salesforce Apex 的测试类中,当需要模拟多个不同的 HTTP 响应时,可以使用 HttpCalloutMock 接口并实现逻辑来区分不同的 HTTP 请求并返回不同的响应。

如果多个 HTTP 请求都使用同一个 HttpCalloutMock 实例,而没有区分逻辑,则只会返回一个默认的响应,这可能会导致测试结果不符合预期。

解决方法:自定义 Mock 逻辑

通过实现自定义的 HttpCalloutMock,根据请求的 URL 或其他信息区分不同的 HTTP 请求,返回相应的响应。

以下是一个示例代码:

java 复制代码
@isTest
public class MultiHttpMockTest {
    // 自定义 HttpMock 类
    public class CustomHttpCalloutMock implements HttpCalloutMock {
        public HTTPResponse respond(HTTPRequest req) {
            HttpResponse res = new HttpResponse();
            
            // 根据请求的 URL 或 Body 区分不同的响应
            if (req.getEndpoint().contains('https://example.com/api1')) {
                res.setStatusCode(200);
                res.setBody('{"result": "Response for API 1"}');
            } else if (req.getEndpoint().contains('https://example.com/api2')) {
                res.setStatusCode(200);
                res.setBody('{"result": "Response for API 2"}');
            } else {
                res.setStatusCode(404);
                res.setBody('{"error": "Not Found"}');
            }
            return res;
        }
    }
    
    @isTest
    static void testMultipleCallouts() {
        // 设置自定义 HttpMock
        Test.setMock(HttpCalloutMock.class, new CustomHttpCalloutMock());

        // 模拟第一个 API 调用
        HttpRequest req1 = new HttpRequest();
        req1.setEndpoint('https://example.com/api1');
        req1.setMethod('GET');
        HttpResponse res1 = new Http().send(req1);
        System.assertEquals(200, res1.getStatusCode());
        System.assert(res1.getBody().contains('Response for API 1'));

        // 模拟第二个 API 调用
        HttpRequest req2 = new HttpRequest();
        req2.setEndpoint('https://example.com/api2');
        req2.setMethod('GET');
        HttpResponse res2 = new Http().send(req2);
        System.assertEquals(200, res2.getStatusCode());
        System.assert(res2.getBody().contains('Response for API 2'));
    }
}

核心思路

  1. 自定义 HttpCalloutMock :实现 HttpCalloutMock 接口,在 respond 方法中根据请求的内容返回不同的响应。
  2. 使用区分条件 :通过 req.getEndpoint()req.getBody() 或其他属性区分请求。
  3. 设置 Mock :使用 Test.setMock() 方法设置自定义的 HttpCalloutMock
  4. 在测试中验证 :通过 HttpResponse 验证每次 HTTP 调用返回的内容是否符合预期。

注意事项

  • 确保请求的区分逻辑准确:避免因为相似的条件导致错误的响应。
  • 覆盖所有测试场景:为每种可能的请求配置对应的响应,确保测试的完整性。
  • 验证 HTTP 响应内容:不仅要验证状态码,还要验证响应的主体是否符合预期。

这种方式可以确保在测试类中正确模拟多个 HTTP 请求和响应。

相关推荐
Channing Lewis1 个月前
salesforce Portal User Visibility and Site User Visibility
运维·服务器·salesforce
sf_wilson2 个月前
[Admin] Dashboard Filter for Mix Report Types
dashboard·salesforce·admin·report
Channing Lewis3 个月前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
Channing Lewis3 个月前
salesforce developer console 匿名执行是以什么身份执行的
数据库·安全·salesforce
小小码虫4 个月前
如何在页面调用utility bar并传递参数至lwc组件
javascript·ecmascript·salesforce·lwc
小小码虫5 个月前
Salesforce篇——如何在lightning页面添加ListviewButton使用lwc组件
前端·javascript·salesforce
Channing Lewis5 个月前
salesforce rich text 字段支持html中内嵌JavaScript吗
前端·javascript·html·salesforce
数字化营销工兵7 个月前
Salesforce‘s 爱因斯坦机器人助手引领工业聊天机器人时代
copilot·crm·聊天机器人·salesforce·工业机器人
数字化营销工兵8 个月前
Salesforce推出Einstein 1 Studio:用于自定义Einstein Copilot并将人工智能嵌入任何CRM应用程序的低代码人工智能工具
人工智能·大语言模型·crm·数字化营销·salesforce·销售·low code